melonjs 17.3.0 → 18.0.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 (704) hide show
  1. package/{dist/types → build}/application/application.d.ts +16 -10
  2. package/build/application/application.d.ts.map +1 -0
  3. package/build/application/defaultApplicationSettings.d.ts +18 -0
  4. package/build/application/defaultApplicationSettings.d.ts.map +1 -0
  5. package/build/application/header.d.ts +11 -0
  6. package/build/application/header.d.ts.map +1 -0
  7. package/{dist/types → build}/application/resize.d.ts +2 -0
  8. package/build/application/resize.d.ts.map +1 -0
  9. package/build/application/scaleMethods.d.ts +44 -0
  10. package/build/application/scaleMethods.d.ts.map +1 -0
  11. package/build/application/settings.d.ts +85 -0
  12. package/build/application/settings.d.ts.map +1 -0
  13. package/{dist/types → build}/audio/audio.d.ts +37 -59
  14. package/build/audio/audio.d.ts.map +1 -0
  15. package/{dist/types → build}/camera/camera2d.d.ts +42 -75
  16. package/build/camera/camera2d.d.ts.map +1 -0
  17. package/build/const.d.ts +14 -0
  18. package/build/const.d.ts.map +1 -0
  19. package/build/geometries/earcut.d.ts +3 -0
  20. package/build/geometries/earcut.d.ts.map +1 -0
  21. package/build/geometries/ellipse.d.ts +117 -0
  22. package/build/geometries/ellipse.d.ts.map +1 -0
  23. package/build/geometries/line.d.ts +39 -0
  24. package/build/geometries/line.d.ts.map +1 -0
  25. package/build/geometries/observablePoint.d.ts +75 -0
  26. package/build/geometries/observablePoint.d.ts.map +1 -0
  27. package/{dist/types → build}/geometries/path2d.d.ts +11 -5
  28. package/build/geometries/path2d.d.ts.map +1 -0
  29. package/build/geometries/point.d.ts +44 -0
  30. package/build/geometries/point.d.ts.map +1 -0
  31. package/build/geometries/polygon.d.ts +182 -0
  32. package/build/geometries/polygon.d.ts.map +1 -0
  33. package/build/geometries/rectangle.d.ts +135 -0
  34. package/build/geometries/rectangle.d.ts.map +1 -0
  35. package/build/geometries/roundrect.d.ts +67 -0
  36. package/build/geometries/roundrect.d.ts.map +1 -0
  37. package/build/geometries/toarccanvas.d.ts +28 -0
  38. package/build/geometries/toarccanvas.d.ts.map +1 -0
  39. package/{dist/types → build}/index.d.ts +41 -45
  40. package/build/index.d.ts.map +1 -0
  41. package/build/index.js +28318 -0
  42. package/build/index.js.map +7 -0
  43. package/{dist/types → build}/input/gamepad.d.ts +3 -11
  44. package/build/input/gamepad.d.ts.map +1 -0
  45. package/{dist/types → build}/input/input.d.ts +4 -2
  46. package/build/input/input.d.ts.map +1 -0
  47. package/build/input/key.d.ts +105 -0
  48. package/build/input/key.d.ts.map +1 -0
  49. package/build/input/keyboard.d.ts +72 -0
  50. package/build/input/keyboard.d.ts.map +1 -0
  51. package/build/input/pointer.d.ts +180 -0
  52. package/build/input/pointer.d.ts.map +1 -0
  53. package/{dist/types → build}/input/pointerevent.d.ts +17 -15
  54. package/build/input/pointerevent.d.ts.map +1 -0
  55. package/{dist/types → build}/lang/console.d.ts +1 -0
  56. package/build/lang/console.d.ts.map +1 -0
  57. package/build/lang/deprecated.d.ts +24 -0
  58. package/build/lang/deprecated.d.ts.map +1 -0
  59. package/{dist/types → build}/level/level.d.ts +7 -7
  60. package/build/level/level.d.ts.map +1 -0
  61. package/{dist/types → build}/level/tiled/TMXGroup.d.ts +2 -2
  62. package/build/level/tiled/TMXGroup.d.ts.map +1 -0
  63. package/{dist/types → build}/level/tiled/TMXLayer.d.ts +4 -4
  64. package/build/level/tiled/TMXLayer.d.ts.map +1 -0
  65. package/{dist/types → build}/level/tiled/TMXObject.d.ts +3 -3
  66. package/build/level/tiled/TMXObject.d.ts.map +1 -0
  67. package/{dist/types → build}/level/tiled/TMXTile.d.ts +4 -5
  68. package/build/level/tiled/TMXTile.d.ts.map +1 -0
  69. package/{dist/types → build}/level/tiled/TMXTileMap.d.ts +4 -4
  70. package/build/level/tiled/TMXTileMap.d.ts.map +1 -0
  71. package/{dist/types → build}/level/tiled/TMXTileset.d.ts +3 -3
  72. package/build/level/tiled/TMXTileset.d.ts.map +1 -0
  73. package/{dist/types → build}/level/tiled/TMXTilesetGroup.d.ts +1 -1
  74. package/build/level/tiled/TMXTilesetGroup.d.ts.map +1 -0
  75. package/{dist/types → build}/level/tiled/TMXUtils.d.ts +2 -1
  76. package/build/level/tiled/TMXUtils.d.ts.map +1 -0
  77. package/{dist/types → build}/level/tiled/constants.d.ts +1 -0
  78. package/build/level/tiled/constants.d.ts.map +1 -0
  79. package/{dist/types → build}/level/tiled/renderer/TMXHexagonalRenderer.d.ts +3 -4
  80. package/build/level/tiled/renderer/TMXHexagonalRenderer.d.ts.map +1 -0
  81. package/{dist/types → build}/level/tiled/renderer/TMXIsometricRenderer.d.ts +2 -3
  82. package/build/level/tiled/renderer/TMXIsometricRenderer.d.ts.map +1 -0
  83. package/{dist/types → build}/level/tiled/renderer/TMXOrthogonalRenderer.d.ts +1 -2
  84. package/build/level/tiled/renderer/TMXOrthogonalRenderer.d.ts.map +1 -0
  85. package/{dist/types → build}/level/tiled/renderer/TMXRenderer.d.ts +7 -7
  86. package/build/level/tiled/renderer/TMXRenderer.d.ts.map +1 -0
  87. package/{dist/types → build}/level/tiled/renderer/TMXStaggeredRenderer.d.ts +1 -2
  88. package/build/level/tiled/renderer/TMXStaggeredRenderer.d.ts.map +1 -0
  89. package/{dist/types → build}/level/tiled/renderer/autodetect.d.ts +4 -3
  90. package/build/level/tiled/renderer/autodetect.d.ts.map +1 -0
  91. package/build/loader/cache.d.ts +10 -0
  92. package/build/loader/cache.d.ts.map +1 -0
  93. package/{dist/types → build}/loader/loader.d.ts +29 -53
  94. package/build/loader/loader.d.ts.map +1 -0
  95. package/{dist/types → build}/loader/loadingscreen.d.ts +1 -0
  96. package/build/loader/loadingscreen.d.ts.map +1 -0
  97. package/{dist/types → build}/loader/parsers/binary.d.ts +2 -1
  98. package/build/loader/parsers/binary.d.ts.map +1 -0
  99. package/{dist/types → build}/loader/parsers/compressed_textures/compressed_image.d.ts +1 -0
  100. package/build/loader/parsers/compressed_textures/compressed_image.d.ts.map +1 -0
  101. package/build/loader/parsers/compressed_textures/parseDDS.d.ts +2 -0
  102. package/build/loader/parsers/compressed_textures/parseDDS.d.ts.map +1 -0
  103. package/build/loader/parsers/compressed_textures/parseKTX.d.ts +2 -0
  104. package/build/loader/parsers/compressed_textures/parseKTX.d.ts.map +1 -0
  105. package/build/loader/parsers/compressed_textures/parseKTX2.d.ts +2 -0
  106. package/build/loader/parsers/compressed_textures/parseKTX2.d.ts.map +1 -0
  107. package/build/loader/parsers/compressed_textures/parsePKM.d.ts +2 -0
  108. package/build/loader/parsers/compressed_textures/parsePKM.d.ts.map +1 -0
  109. package/build/loader/parsers/compressed_textures/parsePVR.d.ts +2 -0
  110. package/build/loader/parsers/compressed_textures/parsePVR.d.ts.map +1 -0
  111. package/{dist/types → build}/loader/parsers/fetchdata.d.ts +2 -1
  112. package/build/loader/parsers/fetchdata.d.ts.map +1 -0
  113. package/{dist/types → build}/loader/parsers/fontface.d.ts +2 -1
  114. package/build/loader/parsers/fontface.d.ts.map +1 -0
  115. package/{dist/types → build}/loader/parsers/image.d.ts +2 -1
  116. package/build/loader/parsers/image.d.ts.map +1 -0
  117. package/{dist/types → build}/loader/parsers/json.d.ts +2 -1
  118. package/build/loader/parsers/json.d.ts.map +1 -0
  119. package/{dist/types → build}/loader/parsers/script.d.ts +2 -1
  120. package/build/loader/parsers/script.d.ts.map +1 -0
  121. package/{dist/types → build}/loader/parsers/tmx.d.ts +2 -1
  122. package/build/loader/parsers/tmx.d.ts.map +1 -0
  123. package/{dist/types → build}/loader/parsers/video.d.ts +2 -1
  124. package/build/loader/parsers/video.d.ts.map +1 -0
  125. package/build/math/color.d.ts +192 -0
  126. package/build/math/color.d.ts.map +1 -0
  127. package/build/math/math.d.ts +128 -0
  128. package/build/math/math.d.ts.map +1 -0
  129. package/build/math/matrix2d.d.ts +163 -0
  130. package/build/math/matrix2d.d.ts.map +1 -0
  131. package/build/math/matrix3d.d.ts +188 -0
  132. package/build/math/matrix3d.d.ts.map +1 -0
  133. package/build/math/observableVector2d.d.ts +286 -0
  134. package/build/math/observableVector2d.d.ts.map +1 -0
  135. package/build/math/observableVector2d_old.d.ts +76 -0
  136. package/build/math/observableVector2d_old.d.ts.map +1 -0
  137. package/build/math/observableVector3d.d.ts +283 -0
  138. package/build/math/observableVector3d.d.ts.map +1 -0
  139. package/build/math/observableVector3d_old.d.ts +81 -0
  140. package/build/math/observableVector3d_old.d.ts.map +1 -0
  141. package/build/math/vector2d.d.ts +253 -0
  142. package/build/math/vector2d.d.ts.map +1 -0
  143. package/build/math/vector3d.d.ts +242 -0
  144. package/build/math/vector3d.d.ts.map +1 -0
  145. package/{dist/types → build}/particles/emitter.d.ts +16 -40
  146. package/build/particles/emitter.d.ts.map +1 -0
  147. package/build/particles/particle.d.ts +47 -0
  148. package/build/particles/particle.d.ts.map +1 -0
  149. package/{dist/types → build}/particles/settings.d.ts +1 -0
  150. package/build/particles/settings.d.ts.map +1 -0
  151. package/{dist/types → build}/physics/body.d.ts +39 -21
  152. package/build/physics/body.d.ts.map +1 -0
  153. package/build/physics/bounds.d.ts +192 -0
  154. package/build/physics/bounds.d.ts.map +1 -0
  155. package/{dist/types → build}/physics/collision.d.ts +6 -4
  156. package/build/physics/collision.d.ts.map +1 -0
  157. package/{dist/types → build}/physics/detector.d.ts +13 -5
  158. package/build/physics/detector.d.ts.map +1 -0
  159. package/{dist/types → build}/physics/quadtree.d.ts +7 -18
  160. package/build/physics/quadtree.d.ts.map +1 -0
  161. package/{dist/types → build}/physics/response.d.ts +46 -5
  162. package/build/physics/response.d.ts.map +1 -0
  163. package/{dist/types → build}/physics/sat.d.ts +8 -0
  164. package/build/physics/sat.d.ts.map +1 -0
  165. package/{dist/types → build}/physics/world.d.ts +9 -4
  166. package/build/physics/world.d.ts.map +1 -0
  167. package/{dist/types → build}/plugin/plugin.d.ts +11 -18
  168. package/build/plugin/plugin.d.ts.map +1 -0
  169. package/build/polyfill/console.d.ts +2 -0
  170. package/build/polyfill/console.d.ts.map +1 -0
  171. package/build/polyfill/index.d.ts +6 -0
  172. package/build/polyfill/index.d.ts.map +1 -0
  173. package/build/polyfill/roundrect.d.ts +2 -0
  174. package/build/polyfill/roundrect.d.ts.map +1 -0
  175. package/build/pool.d.ts +39 -0
  176. package/build/pool.d.ts.map +1 -0
  177. package/{dist/types → build}/renderable/collectable.d.ts +2 -2
  178. package/build/renderable/collectable.d.ts.map +1 -0
  179. package/build/renderable/colorlayer.d.ts +41 -0
  180. package/build/renderable/colorlayer.d.ts.map +1 -0
  181. package/{dist/types → build}/renderable/container.d.ts +50 -19
  182. package/build/renderable/container.d.ts.map +1 -0
  183. package/{dist/types → build}/renderable/draggable.d.ts +5 -13
  184. package/build/renderable/draggable.d.ts.map +1 -0
  185. package/{dist/types → build}/renderable/dragndrop.d.ts +12 -21
  186. package/build/renderable/dragndrop.d.ts.map +1 -0
  187. package/{dist/types → build}/renderable/entity/entity.d.ts +17 -11
  188. package/build/renderable/entity/entity.d.ts.map +1 -0
  189. package/{dist/types → build}/renderable/imagelayer.d.ts +28 -8
  190. package/build/renderable/imagelayer.d.ts.map +1 -0
  191. package/build/renderable/light2d.d.ts +73 -0
  192. package/build/renderable/light2d.d.ts.map +1 -0
  193. package/{dist/types → build}/renderable/nineslicesprite.d.ts +9 -3
  194. package/build/renderable/nineslicesprite.d.ts.map +1 -0
  195. package/{dist/types → build}/renderable/renderable.d.ts +71 -50
  196. package/build/renderable/renderable.d.ts.map +1 -0
  197. package/{dist/types → build}/renderable/sprite.d.ts +34 -13
  198. package/build/renderable/sprite.d.ts.map +1 -0
  199. package/{dist/types → build}/renderable/text/bitmaptext.d.ts +7 -8
  200. package/build/renderable/text/bitmaptext.d.ts.map +1 -0
  201. package/build/renderable/text/bitmaptextdata.d.ts +17 -0
  202. package/build/renderable/text/bitmaptextdata.d.ts.map +1 -0
  203. package/{dist/types → build}/renderable/text/glyph.d.ts +15 -3
  204. package/build/renderable/text/glyph.d.ts.map +1 -0
  205. package/{dist/types → build}/renderable/text/text.d.ts +7 -16
  206. package/build/renderable/text/text.d.ts.map +1 -0
  207. package/{dist/types → build}/renderable/text/textmetrics.d.ts +8 -9
  208. package/build/renderable/text/textmetrics.d.ts.map +1 -0
  209. package/{dist/types → build}/renderable/text/textstyle.d.ts +1 -0
  210. package/build/renderable/text/textstyle.d.ts.map +1 -0
  211. package/{dist/types → build}/renderable/trigger.d.ts +22 -7
  212. package/build/renderable/trigger.d.ts.map +1 -0
  213. package/{dist/types → build}/renderable/ui/uibaseelement.d.ts +7 -7
  214. package/build/renderable/ui/uibaseelement.d.ts.map +1 -0
  215. package/{dist/types → build}/renderable/ui/uispriteelement.d.ts +4 -6
  216. package/build/renderable/ui/uispriteelement.d.ts.map +1 -0
  217. package/{dist/types → build}/renderable/ui/uitextbutton.d.ts +17 -4
  218. package/build/renderable/ui/uitextbutton.d.ts.map +1 -0
  219. package/{dist/types → build}/state/stage.d.ts +3 -3
  220. package/build/state/stage.d.ts.map +1 -0
  221. package/{dist/types → build}/state/state.d.ts +10 -9
  222. package/build/state/state.d.ts.map +1 -0
  223. package/{dist/types → build}/system/device.d.ts +49 -80
  224. package/build/system/device.d.ts.map +1 -0
  225. package/build/system/dom.d.ts +2 -0
  226. package/build/system/dom.d.ts.map +1 -0
  227. package/{dist/types → build}/system/event.d.ts +124 -291
  228. package/build/system/event.d.ts.map +1 -0
  229. package/build/system/eventEmitter.d.ts +19 -0
  230. package/build/system/eventEmitter.d.ts.map +1 -0
  231. package/build/system/eventEmitter.spec.d.ts +2 -0
  232. package/build/system/eventEmitter.spec.d.ts.map +1 -0
  233. package/{dist/types/system/pooling.d.ts → build/system/legacy_pool.d.ts} +22 -7
  234. package/build/system/legacy_pool.d.ts.map +1 -0
  235. package/build/system/platform.d.ts +34 -0
  236. package/build/system/platform.d.ts.map +1 -0
  237. package/build/system/pool.d.ts +26 -0
  238. package/build/system/pool.d.ts.map +1 -0
  239. package/build/system/save.d.ts +3 -0
  240. package/build/system/save.d.ts.map +1 -0
  241. package/build/system/timer.d.ts +118 -0
  242. package/build/system/timer.d.ts.map +1 -0
  243. package/build/tweens/easing.d.ts +93 -0
  244. package/build/tweens/easing.d.ts.map +1 -0
  245. package/build/tweens/interpolation.d.ts +7 -0
  246. package/build/tweens/interpolation.d.ts.map +1 -0
  247. package/build/tweens/tween.d.ts +234 -0
  248. package/build/tweens/tween.d.ts.map +1 -0
  249. package/build/utils/agent.d.ts +16 -0
  250. package/build/utils/agent.d.ts.map +1 -0
  251. package/build/utils/array-multimap.d.ts +14 -0
  252. package/build/utils/array-multimap.d.ts.map +1 -0
  253. package/build/utils/array.d.ts +30 -0
  254. package/build/utils/array.d.ts.map +1 -0
  255. package/build/utils/file.d.ts +16 -0
  256. package/build/utils/file.d.ts.map +1 -0
  257. package/build/utils/function.d.ts +24 -0
  258. package/build/utils/function.d.ts.map +1 -0
  259. package/build/utils/semver.d.ts +2 -0
  260. package/build/utils/semver.d.ts.map +1 -0
  261. package/build/utils/string.d.ts +35 -0
  262. package/build/utils/string.d.ts.map +1 -0
  263. package/build/utils/types.d.ts +5 -0
  264. package/build/utils/types.d.ts.map +1 -0
  265. package/build/utils/utils.d.ts +49 -0
  266. package/build/utils/utils.d.ts.map +1 -0
  267. package/build/version.d.ts +5 -0
  268. package/build/version.d.ts.map +1 -0
  269. package/{dist/types → build}/video/canvas/canvas_renderer.d.ts +58 -22
  270. package/build/video/canvas/canvas_renderer.d.ts.map +1 -0
  271. package/{dist/types → build}/video/renderer.d.ts +38 -17
  272. package/build/video/renderer.d.ts.map +1 -0
  273. package/{dist/types → build}/video/rendertarget/canvasrendertarget.d.ts +20 -10
  274. package/build/video/rendertarget/canvasrendertarget.d.ts.map +1 -0
  275. package/{dist/types → build}/video/texture/atlas.d.ts +14 -9
  276. package/build/video/texture/atlas.d.ts.map +1 -0
  277. package/{dist/types → build}/video/texture/cache.d.ts +4 -3
  278. package/build/video/texture/cache.d.ts.map +1 -0
  279. package/{dist/types → build}/video/texture/parser/aseprite.d.ts +1 -0
  280. package/build/video/texture/parser/aseprite.d.ts.map +1 -0
  281. package/{dist/types → build}/video/texture/parser/spritesheet.d.ts +1 -0
  282. package/build/video/texture/parser/spritesheet.d.ts.map +1 -0
  283. package/{dist/types → build}/video/texture/parser/texturepacker.d.ts +1 -0
  284. package/build/video/texture/parser/texturepacker.d.ts.map +1 -0
  285. package/build/video/utils/autodetect.d.ts +8 -0
  286. package/build/video/utils/autodetect.d.ts.map +1 -0
  287. package/{dist/types → build}/video/video.d.ts +4 -3
  288. package/build/video/video.d.ts.map +1 -0
  289. package/{dist/types → build}/video/webgl/buffer/vertex.d.ts +5 -6
  290. package/build/video/webgl/buffer/vertex.d.ts.map +1 -0
  291. package/{dist/types → build}/video/webgl/compositors/compositor.d.ts +9 -2
  292. package/build/video/webgl/compositors/compositor.d.ts.map +1 -0
  293. package/{dist/types → build}/video/webgl/compositors/primitive_compositor.d.ts +7 -3
  294. package/build/video/webgl/compositors/primitive_compositor.d.ts.map +1 -0
  295. package/{dist/types → build}/video/webgl/compositors/quad_compositor.d.ts +5 -5
  296. package/build/video/webgl/compositors/quad_compositor.d.ts.map +1 -0
  297. package/{dist/types → build}/video/webgl/glshader.d.ts +2 -2
  298. package/build/video/webgl/glshader.d.ts.map +1 -0
  299. package/{dist/types → build}/video/webgl/utils/attributes.d.ts +1 -0
  300. package/build/video/webgl/utils/attributes.d.ts.map +1 -0
  301. package/{dist/types → build}/video/webgl/utils/precision.d.ts +1 -0
  302. package/build/video/webgl/utils/precision.d.ts.map +1 -0
  303. package/{dist/types → build}/video/webgl/utils/program.d.ts +1 -0
  304. package/build/video/webgl/utils/program.d.ts.map +1 -0
  305. package/{dist/types → build}/video/webgl/utils/string.d.ts +1 -0
  306. package/build/video/webgl/utils/string.d.ts.map +1 -0
  307. package/{dist/types → build}/video/webgl/utils/uniforms.d.ts +1 -0
  308. package/build/video/webgl/utils/uniforms.d.ts.map +1 -0
  309. package/{dist/types → build}/video/webgl/webgl_renderer.d.ts +55 -43
  310. package/build/video/webgl/webgl_renderer.d.ts.map +1 -0
  311. package/package.json +83 -105
  312. package/LICENSE.md +0 -21
  313. package/README.md +0 -223
  314. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +0 -14
  315. package/dist/melonjs.mjs/_virtual/earcut.js +0 -10
  316. package/dist/melonjs.mjs/_virtual/howler.js +0 -10
  317. package/dist/melonjs.mjs/_virtual/index.js +0 -10
  318. package/dist/melonjs.mjs/_virtual/re.js +0 -10
  319. package/dist/melonjs.mjs/application/application.js +0 -437
  320. package/dist/melonjs.mjs/application/header.js +0 -35
  321. package/dist/melonjs.mjs/application/resize.js +0 -123
  322. package/dist/melonjs.mjs/application/settings.js +0 -65
  323. package/dist/melonjs.mjs/audio/audio.js +0 -618
  324. package/dist/melonjs.mjs/camera/camera2d.js +0 -729
  325. package/dist/melonjs.mjs/const.js +0 -32
  326. package/dist/melonjs.mjs/geometries/ellipse.js +0 -245
  327. package/dist/melonjs.mjs/geometries/line.js +0 -108
  328. package/dist/melonjs.mjs/geometries/path2d.js +0 -474
  329. package/dist/melonjs.mjs/geometries/point.js +0 -80
  330. package/dist/melonjs.mjs/geometries/poly.js +0 -433
  331. package/dist/melonjs.mjs/geometries/rectangle.js +0 -330
  332. package/dist/melonjs.mjs/geometries/roundrect.js +0 -165
  333. package/dist/melonjs.mjs/geometries/toarccanvas.js +0 -103
  334. package/dist/melonjs.mjs/index.js +0 -239
  335. package/dist/melonjs.mjs/input/gamepad.js +0 -495
  336. package/dist/melonjs.mjs/input/input.js +0 -26
  337. package/dist/melonjs.mjs/input/keyboard.js +0 -470
  338. package/dist/melonjs.mjs/input/pointer.js +0 -393
  339. package/dist/melonjs.mjs/input/pointerevent.js +0 -803
  340. package/dist/melonjs.mjs/lang/console.js +0 -44
  341. package/dist/melonjs.mjs/lang/deprecated.js +0 -200
  342. package/dist/melonjs.mjs/level/level.js +0 -298
  343. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +0 -120
  344. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +0 -432
  345. package/dist/melonjs.mjs/level/tiled/TMXObject.js +0 -295
  346. package/dist/melonjs.mjs/level/tiled/TMXTile.js +0 -177
  347. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +0 -574
  348. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +0 -292
  349. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +0 -74
  350. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +0 -417
  351. package/dist/melonjs.mjs/level/tiled/constants.js +0 -17
  352. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +0 -503
  353. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +0 -215
  354. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +0 -155
  355. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +0 -113
  356. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +0 -107
  357. package/dist/melonjs.mjs/level/tiled/renderer/autodetect.js +0 -38
  358. package/dist/melonjs.mjs/loader/cache.js +0 -30
  359. package/dist/melonjs.mjs/loader/loader.js +0 -728
  360. package/dist/melonjs.mjs/loader/loadingscreen.js +0 -118
  361. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +0 -10
  362. package/dist/melonjs.mjs/loader/parsers/binary.js +0 -42
  363. package/dist/melonjs.mjs/loader/parsers/compressed_textures/compressed_image.js +0 -58
  364. package/dist/melonjs.mjs/loader/parsers/compressed_textures/parseDDS.js +0 -13
  365. package/dist/melonjs.mjs/loader/parsers/compressed_textures/parseKTX.js +0 -13
  366. package/dist/melonjs.mjs/loader/parsers/compressed_textures/parseKTX2.js +0 -13
  367. package/dist/melonjs.mjs/loader/parsers/compressed_textures/parsePKM.js +0 -13
  368. package/dist/melonjs.mjs/loader/parsers/compressed_textures/parsePVR.js +0 -136
  369. package/dist/melonjs.mjs/loader/parsers/fetchdata.js +0 -62
  370. package/dist/melonjs.mjs/loader/parsers/fontface.js +0 -62
  371. package/dist/melonjs.mjs/loader/parsers/image.js +0 -129
  372. package/dist/melonjs.mjs/loader/parsers/json.js +0 -43
  373. package/dist/melonjs.mjs/loader/parsers/script.js +0 -46
  374. package/dist/melonjs.mjs/loader/parsers/tmx.js +0 -103
  375. package/dist/melonjs.mjs/loader/parsers/video.js +0 -99
  376. package/dist/melonjs.mjs/math/color.js +0 -635
  377. package/dist/melonjs.mjs/math/math.js +0 -221
  378. package/dist/melonjs.mjs/math/matrix2.js +0 -487
  379. package/dist/melonjs.mjs/math/matrix3.js +0 -621
  380. package/dist/melonjs.mjs/math/observable_vector2.js +0 -468
  381. package/dist/melonjs.mjs/math/observable_vector3.js +0 -558
  382. package/dist/melonjs.mjs/math/vector2.js +0 -431
  383. package/dist/melonjs.mjs/math/vector3.js +0 -468
  384. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/esm/arraymultimap.js +0 -45
  385. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/esm/multimap.js +0 -130
  386. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +0 -694
  387. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +0 -352
  388. package/dist/melonjs.mjs/node_modules/eventemitter3/index2.js +0 -12
  389. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +0 -3246
  390. package/dist/melonjs.mjs/node_modules/semver/classes/comparator.js +0 -165
  391. package/dist/melonjs.mjs/node_modules/semver/classes/range.js +0 -565
  392. package/dist/melonjs.mjs/node_modules/semver/classes/semver.js +0 -317
  393. package/dist/melonjs.mjs/node_modules/semver/functions/clean.js +0 -17
  394. package/dist/melonjs.mjs/node_modules/semver/functions/cmp.js +0 -68
  395. package/dist/melonjs.mjs/node_modules/semver/functions/coerce.js +0 -73
  396. package/dist/melonjs.mjs/node_modules/semver/functions/compare-build.js +0 -18
  397. package/dist/melonjs.mjs/node_modules/semver/functions/compare-loose.js +0 -14
  398. package/dist/melonjs.mjs/node_modules/semver/functions/compare.js +0 -16
  399. package/dist/melonjs.mjs/node_modules/semver/functions/diff.js +0 -76
  400. package/dist/melonjs.mjs/node_modules/semver/functions/eq.js +0 -14
  401. package/dist/melonjs.mjs/node_modules/semver/functions/gt.js +0 -14
  402. package/dist/melonjs.mjs/node_modules/semver/functions/gte.js +0 -14
  403. package/dist/melonjs.mjs/node_modules/semver/functions/inc.js +0 -30
  404. package/dist/melonjs.mjs/node_modules/semver/functions/lt.js +0 -14
  405. package/dist/melonjs.mjs/node_modules/semver/functions/lte.js +0 -14
  406. package/dist/melonjs.mjs/node_modules/semver/functions/major.js +0 -14
  407. package/dist/melonjs.mjs/node_modules/semver/functions/minor.js +0 -14
  408. package/dist/melonjs.mjs/node_modules/semver/functions/neq.js +0 -14
  409. package/dist/melonjs.mjs/node_modules/semver/functions/parse.js +0 -27
  410. package/dist/melonjs.mjs/node_modules/semver/functions/patch.js +0 -14
  411. package/dist/melonjs.mjs/node_modules/semver/functions/prerelease.js +0 -17
  412. package/dist/melonjs.mjs/node_modules/semver/functions/rcompare.js +0 -14
  413. package/dist/melonjs.mjs/node_modules/semver/functions/rsort.js +0 -14
  414. package/dist/melonjs.mjs/node_modules/semver/functions/satisfies.js +0 -21
  415. package/dist/melonjs.mjs/node_modules/semver/functions/sort.js +0 -14
  416. package/dist/melonjs.mjs/node_modules/semver/functions/valid.js +0 -17
  417. package/dist/melonjs.mjs/node_modules/semver/index.js +0 -140
  418. package/dist/melonjs.mjs/node_modules/semver/internal/constants.js +0 -44
  419. package/dist/melonjs.mjs/node_modules/semver/internal/debug.js +0 -18
  420. package/dist/melonjs.mjs/node_modules/semver/internal/identifiers.js +0 -32
  421. package/dist/melonjs.mjs/node_modules/semver/internal/lrucache.js +0 -49
  422. package/dist/melonjs.mjs/node_modules/semver/internal/parse-options.js +0 -24
  423. package/dist/melonjs.mjs/node_modules/semver/internal/re.js +0 -234
  424. package/dist/melonjs.mjs/node_modules/semver/ranges/gtr.js +0 -15
  425. package/dist/melonjs.mjs/node_modules/semver/ranges/intersects.js +0 -18
  426. package/dist/melonjs.mjs/node_modules/semver/ranges/ltr.js +0 -15
  427. package/dist/melonjs.mjs/node_modules/semver/ranges/max-satisfying.js +0 -37
  428. package/dist/melonjs.mjs/node_modules/semver/ranges/min-satisfying.js +0 -36
  429. package/dist/melonjs.mjs/node_modules/semver/ranges/min-version.js +0 -74
  430. package/dist/melonjs.mjs/node_modules/semver/ranges/outside.js +0 -98
  431. package/dist/melonjs.mjs/node_modules/semver/ranges/simplify.js +0 -59
  432. package/dist/melonjs.mjs/node_modules/semver/ranges/subset.js +0 -261
  433. package/dist/melonjs.mjs/node_modules/semver/ranges/to-comparators.js +0 -19
  434. package/dist/melonjs.mjs/node_modules/semver/ranges/valid.js +0 -22
  435. package/dist/melonjs.mjs/particles/emitter.js +0 -265
  436. package/dist/melonjs.mjs/particles/particle.js +0 -186
  437. package/dist/melonjs.mjs/particles/settings.js +0 -317
  438. package/dist/melonjs.mjs/physics/body.js +0 -706
  439. package/dist/melonjs.mjs/physics/bounds.js +0 -409
  440. package/dist/melonjs.mjs/physics/collision.js +0 -130
  441. package/dist/melonjs.mjs/physics/detector.js +0 -218
  442. package/dist/melonjs.mjs/physics/quadtree.js +0 -396
  443. package/dist/melonjs.mjs/physics/response.js +0 -57
  444. package/dist/melonjs.mjs/physics/sat.js +0 -483
  445. package/dist/melonjs.mjs/physics/world.js +0 -224
  446. package/dist/melonjs.mjs/plugin/plugin.js +0 -168
  447. package/dist/melonjs.mjs/renderable/collectable.js +0 -60
  448. package/dist/melonjs.mjs/renderable/colorlayer.js +0 -78
  449. package/dist/melonjs.mjs/renderable/container.js +0 -994
  450. package/dist/melonjs.mjs/renderable/draggable.js +0 -121
  451. package/dist/melonjs.mjs/renderable/dragndrop.js +0 -114
  452. package/dist/melonjs.mjs/renderable/entity/entity.js +0 -254
  453. package/dist/melonjs.mjs/renderable/imagelayer.js +0 -288
  454. package/dist/melonjs.mjs/renderable/light2d.js +0 -164
  455. package/dist/melonjs.mjs/renderable/nineslicesprite.js +0 -242
  456. package/dist/melonjs.mjs/renderable/renderable.js +0 -860
  457. package/dist/melonjs.mjs/renderable/sprite.js +0 -694
  458. package/dist/melonjs.mjs/renderable/text/bitmaptext.js +0 -421
  459. package/dist/melonjs.mjs/renderable/text/bitmaptextdata.js +0 -195
  460. package/dist/melonjs.mjs/renderable/text/glyph.js +0 -65
  461. package/dist/melonjs.mjs/renderable/text/text.js +0 -424
  462. package/dist/melonjs.mjs/renderable/text/textmetrics.js +0 -176
  463. package/dist/melonjs.mjs/renderable/text/textstyle.js +0 -21
  464. package/dist/melonjs.mjs/renderable/trigger.js +0 -158
  465. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +0 -285
  466. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +0 -231
  467. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +0 -146
  468. package/dist/melonjs.mjs/state/stage.js +0 -235
  469. package/dist/melonjs.mjs/state/state.js +0 -548
  470. package/dist/melonjs.mjs/system/device.js +0 -872
  471. package/dist/melonjs.mjs/system/dom.js +0 -79
  472. package/dist/melonjs.mjs/system/event.js +0 -606
  473. package/dist/melonjs.mjs/system/platform.js +0 -43
  474. package/dist/melonjs.mjs/system/pooling.js +0 -182
  475. package/dist/melonjs.mjs/system/save.js +0 -157
  476. package/dist/melonjs.mjs/system/timer.js +0 -274
  477. package/dist/melonjs.mjs/tweens/easing.js +0 -334
  478. package/dist/melonjs.mjs/tweens/interpolation.js +0 -112
  479. package/dist/melonjs.mjs/tweens/tween.js +0 -479
  480. package/dist/melonjs.mjs/utils/agent.js +0 -77
  481. package/dist/melonjs.mjs/utils/array.js +0 -63
  482. package/dist/melonjs.mjs/utils/file.js +0 -54
  483. package/dist/melonjs.mjs/utils/function.js +0 -69
  484. package/dist/melonjs.mjs/utils/string.js +0 -82
  485. package/dist/melonjs.mjs/utils/utils.js +0 -139
  486. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +0 -883
  487. package/dist/melonjs.mjs/video/renderer.js +0 -393
  488. package/dist/melonjs.mjs/video/rendertarget/canvasrendertarget.js +0 -310
  489. package/dist/melonjs.mjs/video/texture/atlas.js +0 -460
  490. package/dist/melonjs.mjs/video/texture/cache.js +0 -186
  491. package/dist/melonjs.mjs/video/texture/parser/aseprite.js +0 -78
  492. package/dist/melonjs.mjs/video/texture/parser/spritesheet.js +0 -77
  493. package/dist/melonjs.mjs/video/texture/parser/texturepacker.js +0 -64
  494. package/dist/melonjs.mjs/video/utils/autodetect.js +0 -27
  495. package/dist/melonjs.mjs/video/video.js +0 -142
  496. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +0 -146
  497. package/dist/melonjs.mjs/video/webgl/compositors/compositor.js +0 -234
  498. package/dist/melonjs.mjs/video/webgl/compositors/primitive_compositor.js +0 -77
  499. package/dist/melonjs.mjs/video/webgl/compositors/quad_compositor.js +0 -254
  500. package/dist/melonjs.mjs/video/webgl/glshader.js +0 -166
  501. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +0 -10
  502. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +0 -10
  503. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +0 -10
  504. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +0 -10
  505. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +0 -25
  506. package/dist/melonjs.mjs/video/webgl/utils/precision.js +0 -38
  507. package/dist/melonjs.mjs/video/webgl/utils/program.js +0 -67
  508. package/dist/melonjs.mjs/video/webgl/utils/string.js +0 -25
  509. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +0 -92
  510. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +0 -1199
  511. package/dist/melonjs.module.js +0 -42838
  512. package/dist/types/application/header.d.ts +0 -5
  513. package/dist/types/application/settings.d.ts +0 -105
  514. package/dist/types/const.d.ts +0 -21
  515. package/dist/types/geometries/ellipse.d.ts +0 -127
  516. package/dist/types/geometries/line.d.ts +0 -11
  517. package/dist/types/geometries/point.d.ts +0 -46
  518. package/dist/types/geometries/poly.d.ts +0 -175
  519. package/dist/types/geometries/rectangle.d.ts +0 -130
  520. package/dist/types/geometries/roundrect.d.ts +0 -43
  521. package/dist/types/geometries/toarccanvas.d.ts +0 -10
  522. package/dist/types/input/keyboard.d.ts +0 -205
  523. package/dist/types/input/pointer.d.ts +0 -261
  524. package/dist/types/lang/deprecated.d.ts +0 -68
  525. package/dist/types/loader/cache.d.ts +0 -9
  526. package/dist/types/loader/parsers/compressed_textures/parseDDS.d.ts +0 -1
  527. package/dist/types/loader/parsers/compressed_textures/parseKTX.d.ts +0 -1
  528. package/dist/types/loader/parsers/compressed_textures/parseKTX2.d.ts +0 -1
  529. package/dist/types/loader/parsers/compressed_textures/parsePKM.d.ts +0 -1
  530. package/dist/types/loader/parsers/compressed_textures/parsePVR.d.ts +0 -1
  531. package/dist/types/math/color.d.ts +0 -179
  532. package/dist/types/math/math.d.ts +0 -149
  533. package/dist/types/math/matrix2.d.ts +0 -165
  534. package/dist/types/math/matrix3.d.ts +0 -177
  535. package/dist/types/math/observable_vector2.d.ts +0 -278
  536. package/dist/types/math/observable_vector3.d.ts +0 -277
  537. package/dist/types/math/vector2.d.ts +0 -255
  538. package/dist/types/math/vector3.d.ts +0 -266
  539. package/dist/types/particles/particle.d.ts +0 -32
  540. package/dist/types/physics/bounds.d.ts +0 -195
  541. package/dist/types/polyfill/console.d.ts +0 -1
  542. package/dist/types/polyfill/index.d.ts +0 -1
  543. package/dist/types/polyfill/roundrect.d.ts +0 -1
  544. package/dist/types/renderable/colorlayer.d.ts +0 -28
  545. package/dist/types/renderable/light2d.d.ts +0 -58
  546. package/dist/types/renderable/text/bitmaptextdata.d.ts +0 -35
  547. package/dist/types/system/dom.d.ts +0 -1
  548. package/dist/types/system/platform.d.ts +0 -33
  549. package/dist/types/system/save.d.ts +0 -25
  550. package/dist/types/system/timer.d.ts +0 -126
  551. package/dist/types/tweens/easing.d.ts +0 -46
  552. package/dist/types/tweens/interpolation.d.ts +0 -18
  553. package/dist/types/tweens/tween.d.ts +0 -195
  554. package/dist/types/utils/agent.d.ts +0 -21
  555. package/dist/types/utils/array.d.ts +0 -39
  556. package/dist/types/utils/file.d.ts +0 -27
  557. package/dist/types/utils/function.d.ts +0 -31
  558. package/dist/types/utils/string.d.ts +0 -50
  559. package/dist/types/utils/utils.d.ts +0 -54
  560. package/dist/types/video/utils/autodetect.d.ts +0 -5
  561. package/src/application/application.js +0 -429
  562. package/src/application/header.js +0 -26
  563. package/src/application/resize.js +0 -114
  564. package/src/application/settings.js +0 -56
  565. package/src/audio/audio.js +0 -617
  566. package/src/camera/camera2d.js +0 -724
  567. package/src/const.js +0 -23
  568. package/src/geometries/ellipse.js +0 -236
  569. package/src/geometries/line.js +0 -99
  570. package/src/geometries/path2d.js +0 -464
  571. package/src/geometries/point.js +0 -71
  572. package/src/geometries/poly.js +0 -424
  573. package/src/geometries/rectangle.js +0 -321
  574. package/src/geometries/roundrect.js +0 -156
  575. package/src/geometries/toarccanvas.js +0 -94
  576. package/src/index.js +0 -315
  577. package/src/input/gamepad.js +0 -487
  578. package/src/input/input.js +0 -17
  579. package/src/input/keyboard.js +0 -461
  580. package/src/input/pointer.js +0 -386
  581. package/src/input/pointerevent.js +0 -794
  582. package/src/lang/console.js +0 -36
  583. package/src/lang/deprecated.js +0 -192
  584. package/src/level/level.js +0 -290
  585. package/src/level/tiled/TMXGroup.js +0 -111
  586. package/src/level/tiled/TMXLayer.js +0 -424
  587. package/src/level/tiled/TMXObject.js +0 -286
  588. package/src/level/tiled/TMXTile.js +0 -168
  589. package/src/level/tiled/TMXTileMap.js +0 -569
  590. package/src/level/tiled/TMXTileset.js +0 -284
  591. package/src/level/tiled/TMXTilesetGroup.js +0 -66
  592. package/src/level/tiled/TMXUtils.js +0 -408
  593. package/src/level/tiled/constants.js +0 -8
  594. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +0 -497
  595. package/src/level/tiled/renderer/TMXIsometricRenderer.js +0 -208
  596. package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +0 -149
  597. package/src/level/tiled/renderer/TMXRenderer.js +0 -103
  598. package/src/level/tiled/renderer/TMXStaggeredRenderer.js +0 -100
  599. package/src/level/tiled/renderer/autodetect.js +0 -29
  600. package/src/loader/cache.js +0 -22
  601. package/src/loader/loader.js +0 -727
  602. package/src/loader/loadingscreen.js +0 -112
  603. package/src/loader/melonjs_logo.png +0 -0
  604. package/src/loader/parsers/binary.js +0 -33
  605. package/src/loader/parsers/compressed_textures/compressed_image.js +0 -49
  606. package/src/loader/parsers/compressed_textures/parseDDS.js +0 -5
  607. package/src/loader/parsers/compressed_textures/parseKTX.js +0 -5
  608. package/src/loader/parsers/compressed_textures/parseKTX2.js +0 -5
  609. package/src/loader/parsers/compressed_textures/parsePKM.js +0 -5
  610. package/src/loader/parsers/compressed_textures/parsePVR.js +0 -127
  611. package/src/loader/parsers/fetchdata.js +0 -53
  612. package/src/loader/parsers/fontface.js +0 -54
  613. package/src/loader/parsers/image.js +0 -120
  614. package/src/loader/parsers/json.js +0 -35
  615. package/src/loader/parsers/script.js +0 -37
  616. package/src/loader/parsers/tmx.js +0 -95
  617. package/src/loader/parsers/video.js +0 -90
  618. package/src/math/color.js +0 -627
  619. package/src/math/math.js +0 -212
  620. package/src/math/matrix2.js +0 -479
  621. package/src/math/matrix3.js +0 -613
  622. package/src/math/observable_vector2.js +0 -460
  623. package/src/math/observable_vector3.js +0 -550
  624. package/src/math/vector2.js +0 -423
  625. package/src/math/vector3.js +0 -460
  626. package/src/particles/emitter.js +0 -258
  627. package/src/particles/particle.js +0 -178
  628. package/src/particles/settings.js +0 -310
  629. package/src/physics/body.js +0 -698
  630. package/src/physics/bounds.js +0 -401
  631. package/src/physics/collision.js +0 -123
  632. package/src/physics/detector.js +0 -209
  633. package/src/physics/quadtree.js +0 -387
  634. package/src/physics/response.js +0 -48
  635. package/src/physics/sat.js +0 -473
  636. package/src/physics/world.js +0 -216
  637. package/src/plugin/plugin.js +0 -159
  638. package/src/polyfill/console.js +0 -11
  639. package/src/polyfill/index.js +0 -13
  640. package/src/polyfill/roundrect.js +0 -237
  641. package/src/renderable/collectable.js +0 -51
  642. package/src/renderable/colorlayer.js +0 -70
  643. package/src/renderable/container.js +0 -985
  644. package/src/renderable/draggable.js +0 -114
  645. package/src/renderable/dragndrop.js +0 -106
  646. package/src/renderable/entity/entity.js +0 -246
  647. package/src/renderable/imagelayer.js +0 -280
  648. package/src/renderable/light2d.js +0 -155
  649. package/src/renderable/nineslicesprite.js +0 -233
  650. package/src/renderable/renderable.js +0 -852
  651. package/src/renderable/sprite.js +0 -685
  652. package/src/renderable/text/bitmaptext.js +0 -418
  653. package/src/renderable/text/bitmaptextdata.js +0 -186
  654. package/src/renderable/text/glyph.js +0 -57
  655. package/src/renderable/text/text.js +0 -415
  656. package/src/renderable/text/textmetrics.js +0 -167
  657. package/src/renderable/text/textstyle.js +0 -12
  658. package/src/renderable/trigger.js +0 -149
  659. package/src/renderable/ui/uibaseelement.js +0 -276
  660. package/src/renderable/ui/uispriteelement.js +0 -223
  661. package/src/renderable/ui/uitextbutton.js +0 -140
  662. package/src/state/stage.js +0 -226
  663. package/src/state/state.js +0 -541
  664. package/src/system/device.js +0 -863
  665. package/src/system/dom.js +0 -70
  666. package/src/system/event.js +0 -597
  667. package/src/system/platform.js +0 -34
  668. package/src/system/pooling.js +0 -190
  669. package/src/system/save.js +0 -148
  670. package/src/system/timer.js +0 -281
  671. package/src/tweens/easing.js +0 -325
  672. package/src/tweens/interpolation.js +0 -103
  673. package/src/tweens/tween.js +0 -470
  674. package/src/utils/agent.js +0 -68
  675. package/src/utils/array.js +0 -54
  676. package/src/utils/file.js +0 -46
  677. package/src/utils/function.js +0 -60
  678. package/src/utils/string.js +0 -73
  679. package/src/utils/utils.js +0 -127
  680. package/src/video/canvas/canvas_renderer.js +0 -874
  681. package/src/video/renderer.js +0 -384
  682. package/src/video/rendertarget/canvasrendertarget.js +0 -303
  683. package/src/video/texture/atlas.js +0 -451
  684. package/src/video/texture/cache.js +0 -178
  685. package/src/video/texture/parser/aseprite.js +0 -69
  686. package/src/video/texture/parser/spritesheet.js +0 -68
  687. package/src/video/texture/parser/texturepacker.js +0 -55
  688. package/src/video/utils/autodetect.js +0 -18
  689. package/src/video/video.js +0 -160
  690. package/src/video/webgl/buffer/vertex.js +0 -137
  691. package/src/video/webgl/compositors/compositor.js +0 -225
  692. package/src/video/webgl/compositors/primitive_compositor.js +0 -68
  693. package/src/video/webgl/compositors/quad_compositor.js +0 -245
  694. package/src/video/webgl/glshader.js +0 -158
  695. package/src/video/webgl/shaders/primitive.frag +0 -5
  696. package/src/video/webgl/shaders/primitive.vert +0 -15
  697. package/src/video/webgl/shaders/quad.frag +0 -7
  698. package/src/video/webgl/shaders/quad.vert +0 -18
  699. package/src/video/webgl/utils/attributes.js +0 -16
  700. package/src/video/webgl/utils/precision.js +0 -29
  701. package/src/video/webgl/utils/program.js +0 -58
  702. package/src/video/webgl/utils/string.js +0 -16
  703. package/src/video/webgl/utils/uniforms.js +0 -84
  704. package/src/video/webgl/webgl_renderer.js +0 -1190
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/global-this.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/fails.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/descriptors.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/function-bind-native.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/function-call.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-property-is-enumerable.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/create-property-descriptor.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/function-uncurry-this.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/classof-raw.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/indexed-object.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-null-or-undefined.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/require-object-coercible.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-indexed-object.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-callable.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-object.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/get-built-in.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-is-prototype-of.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/environment-user-agent.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/environment-v8-version.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/symbol-constructor-detection.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/use-symbol-as-uid.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-symbol.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/try-to-string.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/a-callable.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/get-method.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/ordinary-to-primitive.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-pure.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/define-global-property.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/shared-store.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/shared.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-object.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/has-own-property.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/uid.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/well-known-symbol.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-primitive.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-property-key.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/document-create-element.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/ie8-dom-define.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-get-own-property-descriptor.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/v8-prototype-define-bug.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/an-object.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-define-property.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/create-non-enumerable-property.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/function-name.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/inspect-source.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/weak-map-basic-detection.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/shared-key.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/hidden-keys.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/internal-state.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/make-built-in.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/define-built-in.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/math-trunc.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-integer-or-infinity.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-absolute-index.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-length.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/length-of-array-like.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/array-includes.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-keys-internal.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/enum-bug-keys.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-get-own-property-names.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/object-get-own-property-symbols.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/own-keys.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/copy-constructor-properties.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/is-forced.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/export.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/es.global-this.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/esnext.global-this.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/proposals/global-this.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-string-tag-support.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/classof.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/to-string.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/whitespaces.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/string-trim.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/string-trim-forced.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/string-trim-start.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/es.string.trim-left.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/es.string.trim-start.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/entry-unbind.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/es/string/trim-start.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/internals/string-trim-end.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/es.string.trim-right.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/modules/es.string.trim-end.js", "../../../node_modules/.pnpm/core-js@3.48.0/node_modules/core-js/es/string/trim-end.js", "../../../node_modules/.pnpm/howler@2.2.4/node_modules/howler/dist/howler.js", "../src/polyfill/index.ts", "../src/polyfill/console.ts", "../src/polyfill/roundrect.ts", "../src/const.ts", "../src/system/pool.ts", "../src/math/math.ts", "../src/math/vector2d.ts", "../src/geometries/point.ts", "../src/physics/bounds.ts", "../src/geometries/earcut.ts", "../src/geometries/polygon.ts", "../src/geometries/rectangle.ts", "../src/system/device.js", "../src/utils/agent.ts", "../src/utils/string.ts", "../src/video/video.js", "../src/application/scaleMethods.ts", "../src/application/defaultApplicationSettings.ts", "../src/system/event.ts", "../src/system/eventEmitter.ts", "../src/system/platform.ts", "../src/system/dom.ts", "../src/utils/utils.ts", "../src/utils/semver.ts", "../src/utils/array.ts", "../src/utils/file.ts", "../src/utils/function.ts", "../src/system/save.ts", "../src/audio/audio.js", "../src/geometries/observablePoint.ts", "../src/input/input.js", "../src/input/keyboard.ts", "../src/input/gamepad.js", "../src/input/key.ts", "../src/math/color.ts", "../src/math/vector3d.ts", "../src/math/matrix3d.ts", "../src/math/matrix2d.ts", "../src/math/observableVector3d.ts", "../src/geometries/ellipse.ts", "../src/geometries/line.ts", "../src/geometries/roundrect.ts", "../src/renderable/text/glyph.ts", "../src/renderable/text/bitmaptextdata.ts", "../src/tweens/easing.ts", "../src/tweens/interpolation.ts", "../src/tweens/tween.ts", "../src/pool.ts", "../src/system/legacy_pool.js", "../src/physics/collision.js", "../src/physics/body.js", "../src/video/webgl/utils/attributes.js", "../src/video/webgl/utils/precision.js", "../src/video/webgl/utils/program.js", "../src/video/webgl/utils/string.js", "../src/video/webgl/utils/uniforms.js", "../src/video/webgl/glshader.js", "../src/renderable/renderable.js", "../src/loader/loader.js", "../src/lang/console.js", "../src/loader/cache.js", "../src/loader/parsers/fetchdata.js", "../src/loader/parsers/binary.js", "../src/loader/parsers/fontface.js", "../src/loader/parsers/compressed_textures/parseDDS.js", "../src/loader/parsers/compressed_textures/parseKTX.js", "../src/loader/parsers/compressed_textures/parseKTX2.js", "../src/loader/parsers/compressed_textures/parsePKM.js", "../src/loader/parsers/compressed_textures/parsePVR.js", "../src/loader/parsers/compressed_textures/compressed_image.js", "../src/loader/parsers/image.js", "../src/loader/parsers/json.js", "../src/loader/parsers/script.js", "../src/renderable/container.js", "../src/level/tiled/constants.js", "../src/geometries/toarccanvas.ts", "../src/geometries/path2d.js", "../src/video/rendertarget/canvasrendertarget.js", "../src/video/renderer.js", "../src/utils/array-multimap.js", "../src/video/texture/parser/aseprite.js", "../src/video/texture/parser/spritesheet.js", "../src/video/texture/parser/texturepacker.js", "../src/video/texture/atlas.js", "../src/video/texture/cache.js", "../src/video/canvas/canvas_renderer.js", "../src/level/tiled/TMXTile.js", "../src/level/tiled/TMXUtils.js", "../src/level/tiled/TMXLayer.js", "../src/level/tiled/renderer/TMXRenderer.js", "../src/level/tiled/renderer/TMXHexagonalRenderer.js", "../src/level/tiled/renderer/TMXIsometricRenderer.js", "../src/level/tiled/renderer/TMXOrthogonalRenderer.js", "../src/level/tiled/renderer/TMXStaggeredRenderer.js", "../src/level/tiled/renderer/autodetect.js", "../src/level/tiled/TMXObject.js", "../src/level/tiled/TMXGroup.js", "../src/level/tiled/TMXTileset.js", "../src/level/tiled/TMXTilesetGroup.js", "../src/level/tiled/TMXTileMap.js", "../src/level/level.js", "../src/loader/parsers/tmx.js", "../src/loader/parsers/video.js", "../src/renderable/sprite.js", "../src/camera/camera2d.js", "../src/state/stage.js", "../src/loader/loadingscreen.js", "../src/state/state.js", "../src/system/timer.ts", "../src/input/pointer.js", "../src/input/pointerevent.js", "../src/physics/response.js", "../src/physics/sat.js", "../src/physics/detector.js", "../src/physics/quadtree.js", "../src/physics/world.js", "../src/video/webgl/shaders/primitive.frag", "../src/video/webgl/shaders/primitive.vert", "../src/video/webgl/buffer/vertex.js", "../src/video/webgl/compositors/compositor.js", "../src/video/webgl/compositors/primitive_compositor.js", "../src/video/webgl/shaders/quad.frag", "../src/video/webgl/shaders/quad.vert", "../src/video/webgl/compositors/quad_compositor.js", "../src/video/webgl/webgl_renderer.js", "../src/video/utils/autodetect.js", "../src/application/header.js", "../src/application/resize.js", "../src/application/application.js", "../src/particles/particle.ts", "../src/particles/settings.js", "../src/particles/emitter.js", "../src/plugin/plugin.js", "../src/version.ts", "../src/renderable/collectable.js", "../src/renderable/colorlayer.js", "../src/renderable/draggable.js", "../src/renderable/dragndrop.js", "../src/renderable/entity/entity.js", "../src/renderable/imagelayer.js", "../src/renderable/light2d.js", "../src/renderable/nineslicesprite.js", "../src/renderable/text/textstyle.js", "../src/renderable/text/text.js", "../src/renderable/text/textmetrics.js", "../src/renderable/text/bitmaptext.js", "../src/renderable/trigger.js", "../src/renderable/ui/uibaseelement.js", "../src/renderable/ui/uispriteelement.js", "../src/renderable/ui/uitextbutton.js", "../src/math/observableVector2d.ts", "../src/lang/deprecated.js", "../src/index.js"],
4
+ "sourcesContent": ["'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n", "'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n", "'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n", "'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n", "'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n", "'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n", "'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n", "'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n", "'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n", "'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n", "'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n", "'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n", "'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n", "'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n", "'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n", "'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n", "'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n", "'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n", "'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n", "'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n", "'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n", "'use strict';\nmodule.exports = false;\n", "'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n", "'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.48.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '\u00A9 2013\u20132025 Denis Pushkarev (zloirock.ru), 2025\u20132026 CoreJS Company (core-js.io). All rights reserved.',\n license: 'https://github.com/zloirock/core-js/blob/v3.48.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n", "'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n", "'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n", "'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n", "'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n", "'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n", "'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n", "'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n", "'use strict';\nmodule.exports = {};\n", "'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n", "'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n", "'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n", "'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n", "'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n", "'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n", "'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n", "'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n", "'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n", "'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n", "'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n", "'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n", "'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n", "'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n", "'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\n\n// `globalThis` object\n// https://tc39.es/ecma262/#sec-globalthis\n$({ global: true, forced: globalThis.globalThis !== globalThis }, {\n globalThis: globalThis\n});\n", "'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.global-this');\n", "'use strict';\n// https://github.com/tc39/proposal-global\nrequire('../modules/esnext.global-this');\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n", "'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n", "'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n", "'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n", "'use strict';\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n", "'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar ltrim = RegExp('^[' + whitespaces + ']+');\nvar rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '$1');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n", "'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n", "'use strict';\nvar $trimStart = require('../internals/string-trim').start;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.{ trimStart, trimLeft }` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimstart\n// https://tc39.es/ecma262/#String.prototype.trimleft\nmodule.exports = forcedStringTrimMethod('trimStart') ? function trimStart() {\n return $trimStart(this);\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n} : ''.trimStart;\n", "'use strict';\nvar $ = require('../internals/export');\nvar trimStart = require('../internals/string-trim-start');\n\n// `String.prototype.trimLeft` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimleft\n// eslint-disable-next-line es/no-string-prototype-trimleft-trimright -- safe\n$({ target: 'String', proto: true, name: 'trimStart', forced: ''.trimLeft !== trimStart }, {\n trimLeft: trimStart\n});\n", "'use strict';\n// TODO: Remove this line from `core-js@4`\nrequire('../modules/es.string.trim-left');\nvar $ = require('../internals/export');\nvar trimStart = require('../internals/string-trim-start');\n\n// `String.prototype.trimStart` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimstart\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n$({ target: 'String', proto: true, name: 'trimStart', forced: ''.trimStart !== trimStart }, {\n trimStart: trimStart\n});\n", "'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (CONSTRUCTOR, METHOD) {\n return uncurryThis(globalThis[CONSTRUCTOR].prototype[METHOD]);\n};\n", "'use strict';\nrequire('../../modules/es.string.trim-start');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('String', 'trimLeft');\n", "'use strict';\nvar $trimEnd = require('../internals/string-trim').end;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.{ trimEnd, trimRight }` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimend\n// https://tc39.es/ecma262/#String.prototype.trimright\nmodule.exports = forcedStringTrimMethod('trimEnd') ? function trimEnd() {\n return $trimEnd(this);\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n} : ''.trimEnd;\n", "'use strict';\nvar $ = require('../internals/export');\nvar trimEnd = require('../internals/string-trim-end');\n\n// `String.prototype.trimRight` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimend\n// eslint-disable-next-line es/no-string-prototype-trimleft-trimright -- safe\n$({ target: 'String', proto: true, name: 'trimEnd', forced: ''.trimRight !== trimEnd }, {\n trimRight: trimEnd\n});\n", "'use strict';\n// TODO: Remove this line from `core-js@4`\nrequire('../modules/es.string.trim-right');\nvar $ = require('../internals/export');\nvar trimEnd = require('../internals/string-trim-end');\n\n// `String.prototype.trimEnd` method\n// https://tc39.es/ecma262/#sec-string.prototype.trimend\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n$({ target: 'String', proto: true, name: 'trimEnd', forced: ''.trimEnd !== trimEnd }, {\n trimEnd: trimEnd\n});\n", "'use strict';\nrequire('../../modules/es.string.trim-end');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('String', 'trimRight');\n", "/*!\n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i<self._howls.length; i++) {\n if (!self._howls[i]._webAudio) {\n // Get all of the sounds in this Howl group.\n var ids = self._howls[i]._getSoundIds();\n\n // Loop through all sounds and change the volumes.\n for (var j=0; j<ids.length; j++) {\n var sound = self._howls[i]._soundById(ids[j]);\n\n if (sound && sound._node) {\n sound._node.volume = sound._volume * vol;\n }\n }\n }\n }\n\n return self;\n }\n\n return self._volume;\n },\n\n /**\n * Handle muting and unmuting globally.\n * @param {Boolean} muted Is muted or not.\n */\n mute: function(muted) {\n var self = this || Howler;\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n self._muted = muted;\n\n // With Web Audio, we just need to mute the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(muted ? 0 : self._volume, Howler.ctx.currentTime);\n }\n\n // Loop through and mute all HTML5 Audio nodes.\n for (var i=0; i<self._howls.length; i++) {\n if (!self._howls[i]._webAudio) {\n // Get all of the sounds in this Howl group.\n var ids = self._howls[i]._getSoundIds();\n\n // Loop through all sounds and mark the audio node as muted.\n for (var j=0; j<ids.length; j++) {\n var sound = self._howls[i]._soundById(ids[j]);\n\n if (sound && sound._node) {\n sound._node.muted = (muted) ? true : sound._muted;\n }\n }\n }\n }\n\n return self;\n },\n\n /**\n * Handle stopping all sounds globally.\n */\n stop: function() {\n var self = this || Howler;\n\n // Loop through all Howls and stop them.\n for (var i=0; i<self._howls.length; i++) {\n self._howls[i].stop();\n }\n\n return self;\n },\n\n /**\n * Unload and destroy all currently loaded Howl objects.\n * @return {Howler}\n */\n unload: function() {\n var self = this || Howler;\n\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var ua = self._navigator ? self._navigator.userAgent : '';\n var checkOpera = ua.match(/OPR\\/(\\d+)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n var safariVersion = ua.match(/Version\\/(.*?) /);\n var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n var audioNode = new Audio();\n\n // Mark this Audio object as unlocked to ensure it can get returned\n // to the unlocked pool when released.\n audioNode._unlocked = true;\n\n // Add the audio node to the pool.\n self._releaseHtml5Audio(audioNode);\n } catch (e) {\n self.noAudio = true;\n break;\n }\n }\n\n // Loop through any assigned audio nodes and unlock them.\n for (var i=0; i<self._howls.length; i++) {\n if (!self._howls[i]._webAudio) {\n // Get all of the sounds in this Howl group.\n var ids = self._howls[i]._getSoundIds();\n\n // Loop through all sounds and unlock the audio nodes.\n for (var j=0; j<ids.length; j++) {\n var sound = self._howls[i]._soundById(ids[j]);\n\n if (sound && sound._node && !sound._node._unlocked) {\n sound._node._unlocked = true;\n sound._node.load();\n }\n }\n }\n }\n\n // Fix Android can not play in suspend state.\n self._autoResume();\n\n // Create an empty buffer.\n var source = self.ctx.createBufferSource();\n source.buffer = self._scratchBuffer;\n source.connect(self.ctx.destination);\n\n // Play the empty buffer.\n if (typeof source.start === 'undefined') {\n source.noteOn(0);\n } else {\n source.start(0);\n }\n\n // Calling resume() on a stack initiated by user gesture is what actually unlocks the audio on Android Chrome >= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i<self._howls.length; i++) {\n self._howls[i]._emit('unlock');\n }\n };\n };\n\n // Setup a touch start listener to attempt an unlock in.\n document.addEventListener('touchstart', unlock, true);\n document.addEventListener('touchend', unlock, true);\n document.addEventListener('click', unlock, true);\n document.addEventListener('keydown', unlock, true);\n\n return self;\n },\n\n /**\n * Get an unlocked HTML5 Audio object from the pool. If none are left,\n * return a new Audio object and throw a warning.\n * @return {Audio} HTML5 Audio object.\n */\n _obtainHtml5Audio: function() {\n var self = this || Howler;\n\n // Return the next object from the pool if one exists.\n if (self._html5AudioPool.length) {\n return self._html5AudioPool.pop();\n }\n\n //.Check if the audio is locked and throw a warning.\n var testPlay = new Audio().play();\n if (testPlay && typeof Promise !== 'undefined' && (testPlay instanceof Promise || typeof testPlay.then === 'function')) {\n testPlay.catch(function() {\n console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.');\n });\n }\n\n return new Audio();\n },\n\n /**\n * Return an activated HTML5 Audio object to the pool.\n * @return {Howler}\n */\n _releaseHtml5Audio: function(audio) {\n var self = this || Howler;\n\n // Don't add audio to the pool if we don't know if it has been unlocked.\n if (audio._unlocked) {\n self._html5AudioPool.push(audio);\n }\n\n return self;\n },\n\n /**\n * Automatically suspend the Web Audio AudioContext after no sound has played for 30 seconds.\n * This saves processing/energy and fixes various browser-specific bugs with audio getting stuck.\n * @return {Howler}\n */\n _autoSuspend: function() {\n var self = this;\n\n if (!self.autoSuspend || !self.ctx || typeof self.ctx.suspend === 'undefined' || !Howler.usingWebAudio) {\n return;\n }\n\n // Check if any sounds are playing.\n for (var i=0; i<self._howls.length; i++) {\n if (self._howls[i]._webAudio) {\n for (var j=0; j<self._howls[i]._sounds.length; j++) {\n if (!self._howls[i]._sounds[j]._paused) {\n return self;\n }\n }\n }\n }\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n }\n\n // If no sound has played after 30 seconds, suspend the context.\n self._suspendTimer = setTimeout(function() {\n if (!self.autoSuspend) {\n return;\n }\n\n self._suspendTimer = null;\n self.state = 'suspending';\n\n // Handle updating the state of the audio context after suspending.\n var handleSuspension = function() {\n self.state = 'suspended';\n\n if (self._resumeAfterSuspend) {\n delete self._resumeAfterSuspend;\n self._autoResume();\n }\n };\n\n // Either the state gets suspended or it is interrupted.\n // Either way, we need to update the state to suspended.\n self.ctx.suspend().then(handleSuspension, handleSuspension);\n }, 30000);\n\n return self;\n },\n\n /**\n * Automatically resume the Web Audio AudioContext when a new sound is played.\n * @return {Howler}\n */\n _autoResume: function() {\n var self = this;\n\n if (!self.ctx || typeof self.ctx.resume === 'undefined' || !Howler.usingWebAudio) {\n return;\n }\n\n if (self.state === 'running' && self.ctx.state !== 'interrupted' && self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = null;\n } else if (self.state === 'suspended' || self.state === 'running' && self.ctx.state === 'interrupted') {\n self.ctx.resume().then(function() {\n self.state = 'running';\n\n // Emit to all Howls that the audio has resumed.\n for (var i=0; i<self._howls.length; i++) {\n self._howls[i]._emit('resume');\n }\n });\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = null;\n }\n } else if (self.state === 'suspending') {\n self._resumeAfterSuspend = true;\n }\n\n return self;\n }\n };\n\n // Setup the global audio controller.\n var Howler = new HowlerGlobal();\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Create an audio group controller.\n * @param {Object} o Passed in properties for this group.\n */\n var Howl = function(o) {\n var self = this;\n\n // Throw an error if no source is provided.\n if (!o.src || o.src.length === 0) {\n console.error('An array of source files must be passed with any new Howl.');\n return;\n }\n\n self.init(o);\n };\n Howl.prototype = {\n /**\n * Initialize a new Howl group object.\n * @param {Object} o Passed in properties for this group.\n * @return {Howl}\n */\n init: function(o) {\n var self = this;\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!Howler.ctx) {\n setupAudioContext();\n }\n\n // Setup user-defined default properties.\n self._autoplay = o.autoplay || false;\n self._format = (typeof o.format !== 'string') ? o.format : [o.format];\n self._html5 = o.html5 || false;\n self._muted = o.mute || false;\n self._loop = o.loop || false;\n self._pool = o.pool || 5;\n self._preload = (typeof o.preload === 'boolean' || o.preload === 'metadata') ? o.preload : true;\n self._rate = o.rate || 1;\n self._sprite = o.sprite || {};\n self._src = (typeof o.src !== 'string') ? o.src : [o.src];\n self._volume = o.volume !== undefined ? o.volume : 1;\n self._xhr = {\n method: o.xhr && o.xhr.method ? o.xhr.method : 'GET',\n headers: o.xhr && o.xhr.headers ? o.xhr.headers : null,\n withCredentials: o.xhr && o.xhr.withCredentials ? o.xhr.withCredentials : false,\n };\n\n // Setup all other default properties.\n self._duration = 0;\n self._state = 'unloaded';\n self._sounds = [];\n self._endTimers = {};\n self._queue = [];\n self._playLock = false;\n\n // Setup event listeners.\n self._onend = o.onend ? [{fn: o.onend}] : [];\n self._onfade = o.onfade ? [{fn: o.onfade}] : [];\n self._onload = o.onload ? [{fn: o.onload}] : [];\n self._onloaderror = o.onloaderror ? [{fn: o.onloaderror}] : [];\n self._onplayerror = o.onplayerror ? [{fn: o.onplayerror}] : [];\n self._onpause = o.onpause ? [{fn: o.onpause}] : [];\n self._onplay = o.onplay ? [{fn: o.onplay}] : [];\n self._onstop = o.onstop ? [{fn: o.onstop}] : [];\n self._onmute = o.onmute ? [{fn: o.onmute}] : [];\n self._onvolume = o.onvolume ? [{fn: o.onvolume}] : [];\n self._onrate = o.onrate ? [{fn: o.onrate}] : [];\n self._onseek = o.onseek ? [{fn: o.onseek}] : [];\n self._onunlock = o.onunlock ? [{fn: o.onunlock}] : [];\n self._onresume = [];\n\n // Web Audio or HTML5 Audio?\n self._webAudio = Howler.usingWebAudio && !self._html5;\n\n // Automatically try to enable audio.\n if (typeof Howler.ctx !== 'undefined' && Howler.ctx && Howler.autoUnlock) {\n Howler._unlockAudio();\n }\n\n // Keep track of this Howl group in the global controller.\n Howler._howls.push(self);\n\n // If they selected autoplay, add a play event to the load queue.\n if (self._autoplay) {\n self._queue.push({\n event: 'play',\n action: function() {\n self.play();\n }\n });\n }\n\n // Load the source file unless otherwise specified.\n if (self._preload && self._preload !== 'none') {\n self.load();\n }\n\n return self;\n },\n\n /**\n * Load the audio file.\n * @return {Howler}\n */\n load: function() {\n var self = this;\n var url = null;\n\n // If no audio is available, quit immediately.\n if (Howler.noAudio) {\n self._emit('loaderror', null, 'No audio support.');\n return;\n }\n\n // Make sure our source is in an array.\n if (typeof self._src === 'string') {\n self._src = [self._src];\n }\n\n // Loop through the sources and pick the first one that is compatible.\n for (var i=0; i<self._src.length; i++) {\n var ext, str;\n\n if (self._format && self._format[i]) {\n // If an extension was specified, use that instead.\n ext = self._format[i];\n } else {\n // Make sure the source is a string.\n str = self._src[i];\n if (typeof str !== 'string') {\n self._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.');\n continue;\n }\n\n // Extract the file extension from the URL or base64 data URI.\n ext = /^data:audio\\/([^;,]+);/i.exec(str);\n if (!ext) {\n ext = /\\.([^.]+)$/.exec(str.split('?', 1)[0]);\n }\n\n if (ext) {\n ext = ext[1].toLowerCase();\n }\n }\n\n // Log a warning if no extension was found.\n if (!ext) {\n console.warn('No file extension was found. Consider using the \"format\" property or specify an extension.');\n }\n\n // Check if this extension is available.\n if (ext && Howler.codecs(ext)) {\n url = self._src[i];\n break;\n }\n }\n\n if (!url) {\n self._emit('loaderror', null, 'No codec support for selected audio sources.');\n return;\n }\n\n self._src = url;\n self._state = 'loading';\n\n // If the hosting page is HTTPS and the source isn't,\n // drop down to HTML5 Audio to avoid Mixed Content errors.\n if (window.location.protocol === 'https:' && url.slice(0, 5) === 'http:') {\n self._html5 = true;\n self._webAudio = false;\n }\n\n // Create a new sound object and add it to the pool.\n new Sound(self);\n\n // Load and decode the audio data for playback.\n if (self._webAudio) {\n loadBuffer(self);\n }\n\n return self;\n },\n\n /**\n * Play a sound or resume previous playback.\n * @param {String/Number} sprite Sprite name for sprite playback or sound id to continue previous.\n * @param {Boolean} internal Internal Use: true prevents event firing.\n * @return {Number} Sound ID.\n */\n play: function(sprite, internal) {\n var self = this;\n var id = null;\n\n // Determine if a sprite, sound id or nothing was passed\n if (typeof sprite === 'number') {\n id = sprite;\n sprite = null;\n } else if (typeof sprite === 'string' && self._state === 'loaded' && !self._sprite[sprite]) {\n // If the passed sprite doesn't exist, do nothing.\n return null;\n } else if (typeof sprite === 'undefined') {\n // Use the default sound sprite (plays the full audio length).\n sprite = '__default';\n\n // Check if there is a single paused sound that isn't ended.\n // If there is, play that sound. If not, continue as usual.\n if (!self._playLock) {\n var num = 0;\n for (var i=0; i<self._sounds.length; i++) {\n if (self._sounds[i]._paused && !self._sounds[i]._ended) {\n num++;\n id = self._sounds[i]._id;\n }\n }\n\n if (num === 1) {\n sprite = null;\n } else {\n id = null;\n }\n }\n }\n\n // Get the selected node, or get one from the pool.\n var sound = id ? self._soundById(id) : self._inactiveSound();\n\n // If the sound doesn't exist, do nothing.\n if (!sound) {\n return null;\n }\n\n // Select the sprite definition.\n if (id && !sprite) {\n sprite = sound._sprite || '__default';\n }\n\n // If the sound hasn't loaded, we must wait to get the audio's duration.\n // We also need to wait to make sure we don't run into race conditions with\n // the order of function calls.\n if (self._state !== 'loaded') {\n // Set the sprite value on this sound.\n sound._sprite = sprite;\n\n // Mark this sound as not ended in case another sound is played before this one loads.\n sound._ended = false;\n\n // Add the sound to the queue to be played on load.\n var soundId = sound._id;\n self._queue.push({\n event: 'play',\n action: function() {\n self.play(soundId);\n }\n });\n\n return soundId;\n }\n\n // Don't play the sound if an id was passed and it is already playing.\n if (id && !sound._paused) {\n // Trigger the play event, in order to keep iterating through queue.\n if (!internal) {\n self._loadQueue('play');\n }\n\n return sound._id;\n }\n\n // Make sure the AudioContext isn't suspended, and resume it if it is.\n if (self._webAudio) {\n Howler._autoResume();\n }\n\n // Determine how long to play for and where to start playing.\n var seek = Math.max(0, sound._seek > 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n } else {\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = 'loading';\n\n var listener = function() {\n self._state = 'loaded';\n \n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i<ids.length; i++) {\n // Clear the end timer.\n self._clearTimer(ids[i]);\n\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound && !sound._paused) {\n // Reset the seek position.\n sound._seek = self.seek(ids[i]);\n sound._rateSeek = 0;\n sound._paused = true;\n\n // Stop currently running fades.\n self._stopFade(ids[i]);\n\n if (sound._node) {\n if (self._webAudio) {\n // Make sure the sound has been created.\n if (!sound._node.bufferSource) {\n continue;\n }\n\n if (typeof sound._node.bufferSource.stop === 'undefined') {\n sound._node.bufferSource.noteOff(0);\n } else {\n sound._node.bufferSource.stop(0);\n }\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n sound._node.pause();\n }\n }\n }\n\n // Fire the pause event, unless `true` is passed as the 2nd argument.\n if (!arguments[1]) {\n self._emit('pause', sound ? sound._id : null);\n }\n }\n\n return self;\n },\n\n /**\n * Stop playback and reset to start.\n * @param {Number} id The sound ID (empty to stop all in group).\n * @param {Boolean} internal Internal Use: true prevents event firing.\n * @return {Howl}\n */\n stop: function(id, internal) {\n var self = this;\n\n // If the sound hasn't loaded, add it to the load queue to stop when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'stop',\n action: function() {\n self.stop(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be stopped.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i<ids.length; i++) {\n // Clear the end timer.\n self._clearTimer(ids[i]);\n\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound) {\n // Reset the seek position.\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._paused = true;\n sound._ended = true;\n\n // Stop currently running fades.\n self._stopFade(ids[i]);\n\n if (sound._node) {\n if (self._webAudio) {\n // Make sure the sound's AudioBufferSourceNode has been created.\n if (sound._node.bufferSource) {\n if (typeof sound._node.bufferSource.stop === 'undefined') {\n sound._node.bufferSource.noteOff(0);\n } else {\n sound._node.bufferSource.stop(0);\n }\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n }\n } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n sound._node.currentTime = sound._start || 0;\n sound._node.pause();\n\n // If this is a live stream, stop download once the audio is stopped.\n if (sound._node.duration === Infinity) {\n self._clearSound(sound._node);\n }\n }\n }\n\n if (!internal) {\n self._emit('stop', sound._id);\n }\n }\n }\n\n return self;\n },\n\n /**\n * Mute/unmute a single sound or all sounds in this Howl group.\n * @param {Boolean} muted Set to true to mute and false to unmute.\n * @param {Number} id The sound ID to update (omit to mute/unmute all).\n * @return {Howl}\n */\n mute: function(muted, id) {\n var self = this;\n\n // If the sound hasn't loaded, add it to the load queue to mute when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'mute',\n action: function() {\n self.mute(muted, id);\n }\n });\n\n return self;\n }\n\n // If applying mute/unmute to all sounds, update the group's value.\n if (typeof id === 'undefined') {\n if (typeof muted === 'boolean') {\n self._muted = muted;\n } else {\n return self._muted;\n }\n }\n\n // If no id is passed, get all ID's to be muted.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i<ids.length; i++) {\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound) {\n sound._muted = muted;\n\n // Cancel active fade and set the volume to the end value.\n if (sound._interval) {\n self._stopFade(sound._id);\n }\n\n if (self._webAudio && sound._node) {\n sound._node.gain.setValueAtTime(muted ? 0 : sound._volume, Howler.ctx.currentTime);\n } else if (sound._node) {\n sound._node.muted = Howler._muted ? true : muted;\n }\n\n self._emit('mute', sound._id);\n }\n }\n\n return self;\n },\n\n /**\n * Get/set the volume of this sound or of the Howl group. This method can optionally take 0, 1 or 2 arguments.\n * volume() -> Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i<id.length; i++) {\n // Get the sound.\n sound = self._soundById(id[i]);\n\n if (sound) {\n sound._volume = vol;\n\n // Stop currently running fades.\n if (!args[2]) {\n self._stopFade(id[i]);\n }\n\n if (self._webAudio && sound._node && !sound._muted) {\n sound._node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n } else if (sound._node && !sound._muted) {\n sound._node.volume = vol * Howler.volume();\n }\n\n self._emit('volume', sound._id);\n }\n }\n } else {\n sound = id ? self._soundById(id) : self._sounds[0];\n return sound ? sound._volume : 0;\n }\n\n return self;\n },\n\n /**\n * Fade a currently playing sound between two volumes (if no id is passed, all sounds will fade).\n * @param {Number} from The value to fade from (0.0 to 1.0).\n * @param {Number} to The volume to fade to (0.0 to 1.0).\n * @param {Number} len Time in milliseconds to fade.\n * @param {Number} id The sound id (omit to fade all sounds).\n * @return {Howl}\n */\n fade: function(from, to, len, id) {\n var self = this;\n\n // If the sound hasn't loaded, add it to the load queue to fade when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'fade',\n action: function() {\n self.fade(from, to, len, id);\n }\n });\n\n return self;\n }\n\n // Make sure the to/from/len values are numbers.\n from = Math.min(Math.max(0, parseFloat(from)), 1);\n to = Math.min(Math.max(0, parseFloat(to)), 1);\n len = parseFloat(len);\n\n // Set the volume to the start position.\n self.volume(from, id);\n\n // Fade the volume of one or all sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n // Create a linear fade or fall back to timeouts with HTML5 Audio.\n if (sound) {\n // Stop the previous fade if no sprite is being used (otherwise, volume handles this).\n if (!id) {\n self._stopFade(ids[i]);\n }\n\n // If we are using Web Audio, let the native methods do the actual fade.\n if (self._webAudio && !sound._muted) {\n var currentTime = Howler.ctx.currentTime;\n var end = currentTime + (len / 1000);\n sound._volume = from;\n sound._node.gain.setValueAtTime(from, currentTime);\n sound._node.gain.linearRampToValueAtTime(to, end);\n }\n\n self._startFadeInterval(sound, from, to, len, ids[i], typeof id === 'undefined');\n }\n }\n\n return self;\n },\n\n /**\n * Starts the internal interval to fade a sound.\n * @param {Object} sound Reference to sound to fade.\n * @param {Number} from The value to fade from (0.0 to 1.0).\n * @param {Number} to The volume to fade to (0.0 to 1.0).\n * @param {Number} len Time in milliseconds to fade.\n * @param {Number} id The sound id to fade.\n * @param {Boolean} isGroup If true, set the volume on the group.\n */\n _startFadeInterval: function(sound, from, to, len, id, isGroup) {\n var self = this;\n var vol = from;\n var diff = to - from;\n var steps = Math.abs(diff / 0.01);\n var stepLen = Math.max(4, (steps > 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Make sure the volume is in the right bounds.\n if (diff < 0) {\n vol = Math.max(to, vol);\n } else {\n vol = Math.min(to, vol);\n }\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n sound = self._soundById(ids[i]);\n\n if (sound) {\n sound._loop = loop;\n if (self._webAudio && sound._node && sound._node.bufferSource) {\n sound._node.bufferSource.loop = loop;\n if (loop) {\n sound._node.bufferSource.loopStart = sound._start || 0;\n sound._node.bufferSource.loopEnd = sound._stop;\n\n // If playing, restart playback to ensure looping updates.\n if (self.playing(ids[i])) {\n self.pause(ids[i], true);\n self.play(ids[i], true);\n }\n }\n }\n }\n }\n\n return self;\n },\n\n /**\n * Get/set the playback rate of a sound. This method can optionally take 0, 1 or 2 arguments.\n * rate() -> Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i<id.length; i++) {\n // Get the sound.\n sound = self._soundById(id[i]);\n\n if (sound) {\n // Keep track of our position when the rate changed and update the playback\n // start position so we can properly adjust the seek position for time elapsed.\n if (self.playing(id[i])) {\n sound._rateSeek = self.seek(id[i]);\n sound._playStart = self._webAudio ? Howler.ctx.currentTime : sound._playStart;\n }\n sound._rate = rate;\n\n // Change the playback rate.\n if (self._webAudio && sound._node && sound._node.bufferSource) {\n sound._node.bufferSource.playbackRate.setValueAtTime(rate, Howler.ctx.currentTime);\n } else if (sound._node) {\n sound._node.playbackRate = rate;\n }\n\n // Reset the timers.\n var seek = self.seek(id[i]);\n var duration = ((self._sprite[sound._sprite][0] + self._sprite[sound._sprite][1]) / 1000) - seek;\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n\n // Start a new end timer if sound is already playing.\n if (self._endTimers[id[i]] || !sound._paused) {\n self._clearTimer(id[i]);\n self._endTimers[id[i]] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n self._emit('rate', sound._id);\n }\n }\n } else {\n sound = self._soundById(id);\n return sound ? sound._rate : self._rate;\n }\n\n return self;\n },\n\n /**\n * Get/set the seek position of a sound. This method can optionally take 0, 1 or 2 arguments.\n * seek() -> Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n if (self._sounds.length) {\n id = self._sounds[0]._id;\n }\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return 0;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n\n self._emit('seek', id);\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i<self._sounds.length; i++) {\n if (!self._sounds[i]._paused) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Get the duration of this sound. Passing a sound id will return the sprite duration.\n * @param {Number} id The sound id to check. If none is passed, return full source duration.\n * @return {Number} Audio duration in seconds.\n */\n duration: function(id) {\n var self = this;\n var duration = self._duration;\n\n // If we pass an ID, get the sound and return the sprite length.\n var sound = self._soundById(id);\n if (sound) {\n duration = self._sprite[sound._sprite][1] / 1000;\n }\n\n return duration;\n },\n\n /**\n * Returns the current loaded state of this Howl.\n * @return {String} 'unloaded', 'loading', 'loaded'\n */\n state: function() {\n return this._state;\n },\n\n /**\n * Unload and destroy the current Howl object.\n * This will immediately stop all sound instances attached to this group.\n */\n unload: function() {\n var self = this;\n\n // Stop playing any active sounds.\n var sounds = self._sounds;\n for (var i=0; i<sounds.length; i++) {\n // Stop the sound if it is currently playing.\n if (!sounds[i]._paused) {\n self.stop(sounds[i]._id);\n }\n\n // Remove the source or disconnect.\n if (!self._webAudio) {\n // Set the source to 0-second silence to stop any downloading (except in IE).\n self._clearSound(sounds[i]._node);\n\n // Remove any event listeners.\n sounds[i]._node.removeEventListener('error', sounds[i]._errorFn, false);\n sounds[i]._node.removeEventListener(Howler._canPlayEvent, sounds[i]._loadFn, false);\n sounds[i]._node.removeEventListener('ended', sounds[i]._endFn, false);\n\n // Release the Audio object back to the pool.\n Howler._releaseHtml5Audio(sounds[i]._node);\n }\n\n // Empty out all of the nodes.\n delete sounds[i]._node;\n\n // Make sure all timers are cleared out.\n self._clearTimer(sounds[i]._id);\n }\n\n // Remove the references in the global Howler object.\n var index = Howler._howls.indexOf(self);\n if (index >= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i<Howler._howls.length; i++) {\n if (Howler._howls[i]._src === self._src || self._src.indexOf(Howler._howls[i]._src) >= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i<events.length; i++) {\n var isId = (id === events[i].id);\n if (fn === events[i].fn && isId || !fn && isId) {\n events.splice(i, 1);\n break;\n }\n }\n } else if (event) {\n // Clear out all events of this type.\n self['_on' + event] = [];\n } else {\n // Clear out all events of every type.\n var keys = Object.keys(self);\n for (i=0; i<keys.length; i++) {\n if ((keys[i].indexOf('_on') === 0) && Array.isArray(self[keys[i]])) {\n self[keys[i]] = [];\n }\n }\n }\n\n return self;\n },\n\n /**\n * Listen to a custom event and remove it once fired.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @return {Howl}\n */\n once: function(event, fn, id) {\n var self = this;\n\n // Setup the event listener.\n self.on(event, fn, id, 1);\n\n return self;\n },\n\n /**\n * Emit all events of a specific type and pass the sound id.\n * @param {String} event Event name.\n * @param {Number} id Sound ID.\n * @param {Number} msg Message to go with event.\n * @return {Howl}\n */\n _emit: function(event, id, msg) {\n var self = this;\n var events = self['_on' + event];\n\n // Loop through event store and fire all functions.\n for (var i=events.length-1; i>=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i<self._sounds.length; i++) {\n if (id === self._sounds[i]._id) {\n return self._sounds[i];\n }\n }\n\n return null;\n },\n\n /**\n * Return an inactive sound from the pool or create a new one.\n * @return {Sound} Sound playback object.\n */\n _inactiveSound: function() {\n var self = this;\n\n self._drain();\n\n // Find the first inactive node to recycle.\n for (var i=0; i<self._sounds.length; i++) {\n if (self._sounds[i]._ended) {\n return self._sounds[i].reset();\n }\n }\n\n // If no inactive node was found, create a new one.\n return new Sound(self);\n },\n\n /**\n * Drain excess inactive sounds from the pool.\n */\n _drain: function() {\n var self = this;\n var limit = self._pool;\n var cnt = 0;\n var i = 0;\n\n // If there are less sounds than the max pool size, we are done.\n if (self._sounds.length < limit) {\n return;\n }\n\n // Count the number of inactive sounds.\n for (i=0; i<self._sounds.length; i++) {\n if (self._sounds[i]._ended) {\n cnt++;\n }\n }\n\n // Remove excess inactive sounds, going in reverse order.\n for (i=self._sounds.length - 1; i>=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i<self._sounds.length; i++) {\n ids.push(self._sounds[i]._id);\n }\n\n return ids;\n } else {\n return [id];\n }\n },\n\n /**\n * Load the sound back into the buffer source.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _refreshBuffer: function(sound) {\n var self = this;\n\n // Setup the buffer source for playback.\n sound._node.bufferSource = Howler.ctx.createBufferSource();\n sound._node.bufferSource.buffer = cache[self._src];\n\n // Connect to the correct node.\n if (sound._panner) {\n sound._node.bufferSource.connect(sound._panner);\n } else {\n sound._node.bufferSource.connect(sound._node);\n }\n\n // Setup looping and playback rate.\n sound._node.bufferSource.loop = sound._loop;\n if (sound._loop) {\n sound._node.bufferSource.loopStart = sound._start || 0;\n sound._node.bufferSource.loopEnd = sound._stop || 0;\n }\n sound._node.bufferSource.playbackRate.setValueAtTime(sound._rate, Howler.ctx.currentTime);\n\n return self;\n },\n\n /**\n * Prevent memory leaks by cleaning up the buffer source after playback.\n * @param {Object} node Sound's audio node containing the buffer source.\n * @return {Howl}\n */\n _cleanBuffer: function(node) {\n var self = this;\n var isIOS = Howler._navigator && Howler._navigator.vendor.indexOf('Apple') >= 0;\n\n if (!node.bufferSource) {\n return self;\n }\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else if (!Howler.noAudio) {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Listen for the 'ended' event on the sound to account for edge-case where\n // a finite sound has a duration of Infinity.\n self._endFn = self._endListener.bind(self);\n self._node.addEventListener('ended', self._endFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n },\n\n /**\n * HTML5 Audio ended listener callback.\n */\n _endListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Only handle the `ended`` event if the duration is Infinity.\n if (parent._duration === Infinity) {\n // Update the parent duration to match the real audio duration.\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Update the sprite that corresponds to the real duration.\n if (parent._sprite.__default[1] === Infinity) {\n parent._sprite.__default[1] = parent._duration * 1000;\n }\n\n // Run the regular ended method.\n parent._ended(self);\n }\n\n // Clear the event listener since the duration is now correct.\n self._node.removeEventListener('ended', self._endFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i<data.length; ++i) {\n dataView[i] = data.charCodeAt(i);\n }\n\n decodeAudioData(dataView.buffer, self);\n } else {\n // Load the buffer from the URL.\n var xhr = new XMLHttpRequest();\n xhr.open(self._xhr.method, url, true);\n xhr.withCredentials = self._xhr.withCredentials;\n xhr.responseType = 'arraybuffer';\n\n // Apply any custom headers to the request.\n if (self._xhr.headers) {\n Object.keys(self._xhr.headers).forEach(function(key) {\n xhr.setRequestHeader(key, self._xhr.headers[key]);\n });\n }\n\n xhr.onload = function() {\n // Make sure we get a successful response back.\n var code = (xhr.status + '')[0];\n if (code !== '0' && code !== '2' && code !== '3') {\n self._emit('loaderror', null, 'Failed loading audio file with status: ' + xhr.status + '.');\n return;\n }\n\n decodeAudioData(xhr.response, self);\n };\n xhr.onerror = function() {\n // If there is an error, switch to HTML5 Audio.\n if (self._webAudio) {\n self._html5 = true;\n self._webAudio = false;\n self._sounds = [];\n delete cache[url];\n self.load();\n }\n };\n safeXhrSend(xhr);\n }\n };\n\n /**\n * Send the XHR request wrapped in a try/catch.\n * @param {Object} xhr XHR to send.\n */\n var safeXhrSend = function(xhr) {\n try {\n xhr.send();\n } catch (e) {\n xhr.onerror();\n }\n };\n\n /**\n * Decode audio data from an array buffer.\n * @param {ArrayBuffer} arraybuffer The audio data.\n * @param {Howl} self\n */\n var decodeAudioData = function(arraybuffer, self) {\n // Fire a load error if something broke.\n var error = function() {\n self._emit('loaderror', null, 'Decoding audio data failed.');\n };\n\n // Load the sound on success.\n var success = function(buffer) {\n if (buffer && self._sounds.length > 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (typeof define === 'function' && define.amd) {\n define([], function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n });\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (typeof exports !== 'undefined') {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Add to global in Node.js (for testing, etc).\n if (typeof global !== 'undefined') {\n global.HowlerGlobal = HowlerGlobal;\n global.Howler = Howler;\n global.Howl = Howl;\n global.Sound = Sound;\n } else if (typeof window !== 'undefined') { // Define globally in case AMD is not available or unused.\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound) {\n if (typeof pan === 'number') {\n sound._stereo = pan;\n sound._pos = [pan, 0, 0];\n\n if (sound._node) {\n // If we are falling back, make sure the panningModel is equalpower.\n sound._pannerAttr.panningModel = 'equalpower';\n\n // Check if there is a panner setup and create a new one if not.\n if (!sound._panner || !sound._panner.pan) {\n setupPanner(sound, pannerType);\n }\n\n if (pannerType === 'spatial') {\n if (typeof sound._panner.positionX !== 'undefined') {\n sound._panner.positionX.setValueAtTime(pan, Howler.ctx.currentTime);\n sound._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime);\n sound._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime);\n } else {\n sound._panner.setPosition(pan, 0, 0);\n }\n } else {\n sound._panner.pan.setValueAtTime(pan, Howler.ctx.currentTime);\n }\n }\n\n self._emit('stereo', sound._id);\n } else {\n return sound._stereo;\n }\n }\n }\n\n return self;\n };\n\n /**\n * Get/set the 3D spatial position of the audio source for this sound or group relative to the global listener.\n * @param {Number} x The x-position of the audio source.\n * @param {Number} y The y-position of the audio source.\n * @param {Number} z The z-position of the audio source.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Array} Returns self or the current 3D spatial position: [x, y, z].\n */\n Howl.prototype.pos = function(x, y, z, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change position when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'pos',\n action: function() {\n self.pos(x, y, z, id);\n }\n });\n\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? 0 : y;\n z = (typeof z !== 'number') ? -0.5 : z;\n\n // Setup the group's spatial position if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's spatial position if no parameters are passed.\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n } else {\n return self._pos;\n }\n }\n\n // Change the spatial position of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound) {\n if (typeof x === 'number') {\n sound._pos = [x, y, z];\n\n if (sound._node) {\n // Check if there is a panner setup and create a new one if not.\n if (!sound._panner || sound._panner.pan) {\n setupPanner(sound, 'spatial');\n }\n\n if (typeof sound._panner.positionX !== 'undefined') {\n sound._panner.positionX.setValueAtTime(x, Howler.ctx.currentTime);\n sound._panner.positionY.setValueAtTime(y, Howler.ctx.currentTime);\n sound._panner.positionZ.setValueAtTime(z, Howler.ctx.currentTime);\n } else {\n sound._panner.setPosition(x, y, z);\n }\n }\n\n self._emit('pos', sound._id);\n } else {\n return sound._pos;\n }\n }\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the audio source is pointing in the 3D cartesian coordinate\n * space. Depending on how direction the sound is, based on the `cone` attributes,\n * a sound pointing away from the listener can be quiet or silent.\n * @param {Number} x The x-orientation of the source.\n * @param {Number} y The y-orientation of the source.\n * @param {Number} z The z-orientation of the source.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Array} Returns self or the current 3D spatial orientation: [x, y, z].\n */\n Howl.prototype.orientation = function(x, y, z, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change orientation when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'orientation',\n action: function() {\n self.orientation(x, y, z, id);\n }\n });\n\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._orientation[1] : y;\n z = (typeof z !== 'number') ? self._orientation[2] : z;\n\n // Setup the group's spatial orientation if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's spatial orientation if no parameters are passed.\n if (typeof x === 'number') {\n self._orientation = [x, y, z];\n } else {\n return self._orientation;\n }\n }\n\n // Change the spatial orientation of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n // Get the sound.\n var sound = self._soundById(ids[i]);\n\n if (sound) {\n if (typeof x === 'number') {\n sound._orientation = [x, y, z];\n\n if (sound._node) {\n // Check if there is a panner setup and create a new one if not.\n if (!sound._panner) {\n // Make sure we have a position to setup the node with.\n if (!sound._pos) {\n sound._pos = self._pos || [0, 0, -0.5];\n }\n\n setupPanner(sound, 'spatial');\n }\n\n if (typeof sound._panner.orientationX !== 'undefined') {\n sound._panner.orientationX.setValueAtTime(x, Howler.ctx.currentTime);\n sound._panner.orientationY.setValueAtTime(y, Howler.ctx.currentTime);\n sound._panner.orientationZ.setValueAtTime(z, Howler.ctx.currentTime);\n } else {\n sound._panner.setOrientation(x, y, z);\n }\n }\n\n self._emit('orientation', sound._id);\n } else {\n return sound._orientation;\n }\n }\n }\n\n return self;\n };\n\n /**\n * Get/set the panner node's attributes for a sound or group of sounds.\n * This method can optionall take 0, 1 or 2 arguments.\n * pannerAttr() -> Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, \u221E]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i<ids.length; i++) {\n sound = self._soundById(ids[i]);\n\n if (sound) {\n // Merge the new values into the sound.\n var pa = sound._pannerAttr;\n pa = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : pa.coneInnerAngle,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : pa.coneOuterAngle,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : pa.coneOuterGain,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : pa.distanceModel,\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : pa.maxDistance,\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : pa.refDistance,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : pa.rolloffFactor,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : pa.panningModel\n };\n\n // Create a new panner node if one doesn't already exist.\n var panner = sound._panner;\n if (!panner) {\n // Make sure we have a position to setup the node with.\n if (!sound._pos) {\n sound._pos = self._pos || [0, 0, -0.5];\n }\n\n // Create a new panner node.\n setupPanner(sound, 'spatial');\n panner = sound._panner\n }\n\n // Update the panner values or create a new panner if none exists.\n panner.coneInnerAngle = pa.coneInnerAngle;\n panner.coneOuterAngle = pa.coneOuterAngle;\n panner.coneOuterGain = pa.coneOuterGain;\n panner.distanceModel = pa.distanceModel;\n panner.maxDistance = pa.maxDistance;\n panner.refDistance = pa.refDistance;\n panner.rolloffFactor = pa.rolloffFactor;\n panner.panningModel = pa.panningModel;\n }\n }\n\n return self;\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core Sound init.\n * @param {Function} _super Core Sound init method.\n * @return {Sound}\n */\n Sound.prototype.init = (function(_super) {\n return function() {\n var self = this;\n var parent = self._parent;\n\n // Setup user-defined default properties.\n self._orientation = parent._orientation;\n self._stereo = parent._stereo;\n self._pos = parent._pos;\n self._pannerAttr = parent._pannerAttr;\n\n // Complete initilization with howler.js core Sound's init function.\n _super.call(this);\n\n // If a stereo or position was specified, set it up.\n if (self._stereo) {\n parent.stereo(self._stereo);\n } else if (self._pos) {\n parent.pos(self._pos[0], self._pos[1], self._pos[2], self._id);\n }\n };\n })(Sound.prototype.init);\n\n /**\n * Override the Sound.reset method to clean up properties from the spatial plugin.\n * @param {Function} _super Sound reset method.\n * @return {Sound}\n */\n Sound.prototype.reset = (function(_super) {\n return function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all spatial plugin properties on this sound.\n self._orientation = parent._orientation;\n self._stereo = parent._stereo;\n self._pos = parent._pos;\n self._pannerAttr = parent._pannerAttr;\n\n // If a stereo or position was specified, set it up.\n if (self._stereo) {\n parent.stereo(self._stereo);\n } else if (self._pos) {\n parent.pos(self._pos[0], self._pos[1], self._pos[2], self._id);\n } else if (self._panner) {\n // Disconnect the panner.\n self._panner.disconnect(0);\n self._panner = undefined;\n parent._refreshBuffer(self);\n }\n\n // Complete resetting of the sound.\n return _super.call(this);\n };\n })(Sound.prototype.reset);\n\n /** Helper Methods **/\n /***************************************************************************/\n\n /**\n * Create a new panner node and save it on the sound.\n * @param {Sound} sound Specific sound to setup panning on.\n * @param {String} type Type of panner to create: 'stereo' or 'spatial'.\n */\n var setupPanner = function(sound, type) {\n type = type || 'spatial';\n\n // Create the new panner node.\n if (type === 'spatial') {\n sound._panner = Howler.ctx.createPanner();\n sound._panner.coneInnerAngle = sound._pannerAttr.coneInnerAngle;\n sound._panner.coneOuterAngle = sound._pannerAttr.coneOuterAngle;\n sound._panner.coneOuterGain = sound._pannerAttr.coneOuterGain;\n sound._panner.distanceModel = sound._pannerAttr.distanceModel;\n sound._panner.maxDistance = sound._pannerAttr.maxDistance;\n sound._panner.refDistance = sound._pannerAttr.refDistance;\n sound._panner.rolloffFactor = sound._pannerAttr.rolloffFactor;\n sound._panner.panningModel = sound._pannerAttr.panningModel;\n\n if (typeof sound._panner.positionX !== 'undefined') {\n sound._panner.positionX.setValueAtTime(sound._pos[0], Howler.ctx.currentTime);\n sound._panner.positionY.setValueAtTime(sound._pos[1], Howler.ctx.currentTime);\n sound._panner.positionZ.setValueAtTime(sound._pos[2], Howler.ctx.currentTime);\n } else {\n sound._panner.setPosition(sound._pos[0], sound._pos[1], sound._pos[2]);\n }\n\n if (typeof sound._panner.orientationX !== 'undefined') {\n sound._panner.orientationX.setValueAtTime(sound._orientation[0], Howler.ctx.currentTime);\n sound._panner.orientationY.setValueAtTime(sound._orientation[1], Howler.ctx.currentTime);\n sound._panner.orientationZ.setValueAtTime(sound._orientation[2], Howler.ctx.currentTime);\n } else {\n sound._panner.setOrientation(sound._orientation[0], sound._orientation[1], sound._orientation[2]);\n }\n } else {\n sound._panner = Howler.ctx.createStereoPanner();\n sound._panner.pan.setValueAtTime(sound._stereo, Howler.ctx.currentTime);\n }\n\n sound._panner.connect(sound._node);\n\n // Update the connections.\n if (!sound._paused) {\n sound._parent.pause(sound._id, true).play(sound._id, true);\n }\n };\n})();\n", "// https://github.com/melonjs/melonJS/issues/1092\nimport \"core-js/proposals/global-this\";\n\n// es10 string trim functions\nimport \"core-js/es/string/trim-start\";\nimport \"core-js/es/string/trim-end\";\n\n// \"built-in\" polyfills\nimport \"./console.ts\";\nimport \"./roundrect.js\";\n", "if (typeof globalThis !== \"undefined\") {\n\tif (typeof globalThis.console === \"undefined\") {\n\t\tglobalThis.console = {} as Console;\n\t\tglobalThis.console.log = function () {};\n\t\tglobalThis.console.assert = function () {};\n\t\tglobalThis.console.warn = function () {};\n\t\tglobalThis.console.error = function (...args: any[]) {\n\t\t\talert(Array.prototype.slice.call(args).join(\", \"));\n\t\t};\n\t}\n}\n", "/*\n * based on https://www.npmjs.com/package/canvas-roundrect-polyfill\n * @version 0.0.1\n */\n\n/** @ignore */\nfunction roundRect(\n\tthis: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tradii: unknown,\n) {\n\tif (\n\t\t![x, y, w, h].every((input) => {\n\t\t\treturn Number.isFinite(input);\n\t\t})\n\t) {\n\t\treturn;\n\t}\n\n\tconst parsedRadii = parseRadiiArgument(radii);\n\n\tlet upperLeft;\n\tlet upperRight;\n\tlet lowerRight;\n\tlet lowerLeft;\n\n\tif (parsedRadii.length === 4) {\n\t\tupperLeft = toCornerPoint(parsedRadii[0]);\n\t\tupperRight = toCornerPoint(parsedRadii[1]);\n\t\tlowerRight = toCornerPoint(parsedRadii[2]);\n\t\tlowerLeft = toCornerPoint(parsedRadii[3]);\n\t} else if (parsedRadii.length === 3) {\n\t\tupperLeft = toCornerPoint(parsedRadii[0]);\n\t\tupperRight = toCornerPoint(parsedRadii[1]);\n\t\tlowerLeft = toCornerPoint(parsedRadii[1]);\n\t\tlowerRight = toCornerPoint(parsedRadii[2]);\n\t} else if (parsedRadii.length === 2) {\n\t\tupperLeft = toCornerPoint(parsedRadii[0]);\n\t\tlowerRight = toCornerPoint(parsedRadii[0]);\n\t\tupperRight = toCornerPoint(parsedRadii[1]);\n\t\tlowerLeft = toCornerPoint(parsedRadii[1]);\n\t} else if (parsedRadii.length === 1) {\n\t\tupperLeft = toCornerPoint(parsedRadii[0]);\n\t\tupperRight = toCornerPoint(parsedRadii[0]);\n\t\tlowerRight = toCornerPoint(parsedRadii[0]);\n\t\tlowerLeft = toCornerPoint(parsedRadii[0]);\n\t} else {\n\t\tthrow new Error(\n\t\t\t`${parsedRadii.length} is not a valid size for radii sequence.`,\n\t\t);\n\t}\n\n\tconst corners = [upperLeft, upperRight, lowerRight, lowerLeft];\n\tconst negativeCorner = corners.find(({ x, y }) => {\n\t\treturn x < 0 || y < 0;\n\t});\n\t//const negativeValue = negativeCorner?.x < 0 ? negativeCorner.x : negativeCorner?.y\n\n\tif (\n\t\tcorners.some(({ x, y }) => {\n\t\t\treturn !Number.isFinite(x) || !Number.isFinite(y);\n\t\t})\n\t) {\n\t\treturn;\n\t}\n\n\tif (negativeCorner) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions\n\t\tthrow new Error(`Radius value ${negativeCorner} is negative.`);\n\t}\n\n\tfixOverlappingCorners(corners);\n\n\tif (w < 0 && h < 0) {\n\t\tthis.moveTo(x - upperLeft.x, y);\n\t\tthis.ellipse(\n\t\t\tx + w + upperRight.x,\n\t\t\ty - upperRight.y,\n\t\t\tupperRight.x,\n\t\t\tupperRight.y,\n\t\t\t0,\n\t\t\t-Math.PI * 1.5,\n\t\t\t-Math.PI,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + w + lowerRight.x,\n\t\t\ty + h + lowerRight.y,\n\t\t\tlowerRight.x,\n\t\t\tlowerRight.y,\n\t\t\t0,\n\t\t\t-Math.PI,\n\t\t\t-Math.PI / 2,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx - lowerLeft.x,\n\t\t\ty + h + lowerLeft.y,\n\t\t\tlowerLeft.x,\n\t\t\tlowerLeft.y,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx - upperLeft.x,\n\t\t\ty - upperLeft.y,\n\t\t\tupperLeft.x,\n\t\t\tupperLeft.y,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t);\n\t} else if (w < 0) {\n\t\tthis.moveTo(x - upperLeft.x, y);\n\t\tthis.ellipse(\n\t\t\tx + w + upperRight.x,\n\t\t\ty + upperRight.y,\n\t\t\tupperRight.x,\n\t\t\tupperRight.y,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\t-Math.PI,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + w + lowerRight.x,\n\t\t\ty + h - lowerRight.y,\n\t\t\tlowerRight.x,\n\t\t\tlowerRight.y,\n\t\t\t0,\n\t\t\t-Math.PI,\n\t\t\t-Math.PI * 1.5,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx - lowerLeft.x,\n\t\t\ty + h - lowerLeft.y,\n\t\t\tlowerLeft.x,\n\t\t\tlowerLeft.y,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t\t0,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx - upperLeft.x,\n\t\t\ty + upperLeft.y,\n\t\t\tupperLeft.x,\n\t\t\tupperLeft.y,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\ttrue,\n\t\t);\n\t} else if (h < 0) {\n\t\tthis.moveTo(x + upperLeft.x, y);\n\t\tthis.ellipse(\n\t\t\tx + w - upperRight.x,\n\t\t\ty - upperRight.y,\n\t\t\tupperRight.x,\n\t\t\tupperRight.y,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t\t0,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + w - lowerRight.x,\n\t\t\ty + h + lowerRight.y,\n\t\t\tlowerRight.x,\n\t\t\tlowerRight.y,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + lowerLeft.x,\n\t\t\ty + h + lowerLeft.y,\n\t\t\tlowerLeft.x,\n\t\t\tlowerLeft.y,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\t-Math.PI,\n\t\t\ttrue,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + upperLeft.x,\n\t\t\ty - upperLeft.y,\n\t\t\tupperLeft.x,\n\t\t\tupperLeft.y,\n\t\t\t0,\n\t\t\t-Math.PI,\n\t\t\t-Math.PI * 1.5,\n\t\t\ttrue,\n\t\t);\n\t} else {\n\t\tthis.moveTo(x + upperLeft.x, y);\n\t\tthis.ellipse(\n\t\t\tx + w - upperRight.x,\n\t\t\ty + upperRight.y,\n\t\t\tupperRight.x,\n\t\t\tupperRight.y,\n\t\t\t0,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + w - lowerRight.x,\n\t\t\ty + h - lowerRight.y,\n\t\t\tlowerRight.x,\n\t\t\tlowerRight.y,\n\t\t\t0,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + lowerLeft.x,\n\t\t\ty + h - lowerLeft.y,\n\t\t\tlowerLeft.x,\n\t\t\tlowerLeft.y,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t\tMath.PI,\n\t\t);\n\t\tthis.ellipse(\n\t\t\tx + upperLeft.x,\n\t\t\ty + upperLeft.y,\n\t\t\tupperLeft.x,\n\t\t\tupperLeft.y,\n\t\t\t0,\n\t\t\tMath.PI,\n\t\t\tMath.PI * 1.5,\n\t\t);\n\t}\n\n\tthis.closePath();\n\tthis.moveTo(x, y);\n\n\t/** @ignore */\n\tfunction toDOMPointInit(value: {\n\t\tx: number;\n\t\ty: number;\n\t\tz: number;\n\t\tw: number;\n\t}) {\n\t\tconst { x, y, z, w } = value;\n\t\treturn { x, y, z, w };\n\t}\n\n\t/** @ignore */\n\tfunction parseRadiiArgument(\n\t\tvalue: any,\n\t):\n\t\t| [number, number, number, number]\n\t\t| [number, number, number]\n\t\t| [number, number]\n\t\t| [number]\n\t\t| unknown[] {\n\t\t// https://webidl.spec.whatwg.org/#es-union\n\t\t// with 'optional (unrestricted double or DOMPointInit\n\t\t// or sequence<(unrestricted double or DOMPointInit)>) radii = 0'\n\t\tconst type = typeof value;\n\n\t\tif (type === \"undefined\" || value === null) {\n\t\t\treturn [0];\n\t\t}\n\t\tif (type === \"function\") {\n\t\t\treturn [NaN];\n\t\t}\n\t\tif (type === \"object\") {\n\t\t\tif (typeof value[Symbol.iterator] === \"function\") {\n\t\t\t\treturn [...value].map((elem) => {\n\t\t\t\t\t// https://webidl.spec.whatwg.org/#es-union\n\t\t\t\t\t// with '(unrestricted double or DOMPointInit)'\n\t\t\t\t\tconst elemType = typeof elem;\n\t\t\t\t\tif (elemType === \"undefined\" || elem === null) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (elemType === \"function\") {\n\t\t\t\t\t\treturn NaN;\n\t\t\t\t\t}\n\t\t\t\t\tif (elemType === \"object\") {\n\t\t\t\t\t\treturn toDOMPointInit(elem);\n\t\t\t\t\t}\n\t\t\t\t\treturn toUnrestrictedNumber(elem);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn [toDOMPointInit(value)];\n\t\t}\n\n\t\treturn [toUnrestrictedNumber(value)];\n\t}\n\n\t/** @ignore */\n\tfunction toUnrestrictedNumber(value: any) {\n\t\treturn +value;\n\t}\n\n\t/** @ignore */\n\tfunction toCornerPoint(value: any) {\n\t\tconst asNumber = toUnrestrictedNumber(value);\n\t\tif (Number.isFinite(asNumber)) {\n\t\t\treturn {\n\t\t\t\tx: asNumber,\n\t\t\t\ty: asNumber,\n\t\t\t};\n\t\t}\n\t\tif (Object(value) === value) {\n\t\t\treturn {\n\t\t\t\tx: toUnrestrictedNumber(value.x || 0),\n\t\t\t\ty: toUnrestrictedNumber(value.y || 0),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tx: NaN,\n\t\t\ty: NaN,\n\t\t};\n\t}\n\n\t/** @ignore */\n\tfunction fixOverlappingCorners(corners: any) {\n\t\tconst [upperLeft, upperRight, lowerRight, lowerLeft] = corners;\n\t\tconst factors = [\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tMath.abs(w) / (upperLeft.x + upperRight.x),\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tMath.abs(h) / (upperRight.y + lowerRight.y),\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tMath.abs(w) / (lowerRight.x + lowerLeft.x),\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tMath.abs(h) / (upperLeft.y + lowerLeft.y),\n\t\t];\n\t\tconst minFactor = Math.min(...factors);\n\t\tif (minFactor <= 1) {\n\t\t\tcorners.forEach((radii: any) => {\n\t\t\t\tradii.x *= minFactor;\n\t\t\t\tradii.y *= minFactor;\n\t\t\t});\n\t\t}\n\t}\n}\n\nif (globalThis.CanvasRenderingContext2D) {\n\tif (typeof globalThis.Path2D.prototype.roundRect === \"undefined\") {\n\t\tglobalThis.Path2D.prototype.roundRect = roundRect;\n\t}\n}\nif (globalThis.CanvasRenderingContext2D) {\n\tif (\n\t\ttypeof globalThis.CanvasRenderingContext2D.prototype.roundRect ===\n\t\t\"undefined\"\n\t) {\n\t\tglobalThis.CanvasRenderingContext2D.prototype.roundRect = roundRect;\n\t}\n}\nif (globalThis.OffscreenCanvasRenderingContext2D) {\n\tif (\n\t\ttypeof globalThis.OffscreenCanvasRenderingContext2D.prototype.roundRect ===\n\t\t\"undefined\"\n\t) {\n\t\tglobalThis.OffscreenCanvasRenderingContext2D.prototype.roundRect =\n\t\t\troundRect;\n\t}\n}\n", "/**\n * constant to select the HTML5 Canvas renderer\n */\nexport const CANVAS = 0;\n\n/**\n * constant to select select the WebGL renderer\n */\nexport const WEBGL = 1;\n\n/**\n * constant to auto-select the renderer (Attempt WebGL first, with fallback to Canvas)\n */\nexport const AUTO = 2;\n\nexport type RendererType = typeof CANVAS | typeof WEBGL | typeof AUTO;\n", "const takeFromSet = <T>(set: Set<T>) => {\n\tfor (const value of set) {\n\t\tset.delete(value);\n\t\treturn value;\n\t}\n};\n\nexport interface Pool<T, A extends unknown[]> {\n\tget(...args: A): T;\n\trelease(object: T): void;\n\tpurge(): void;\n\tsize(): number;\n\tused(): number;\n}\n\ntype Reset<A extends unknown[]> = ((...args: A) => void) | undefined;\ntype Release = (() => void) | undefined;\n\nexport interface CreatePoolOptions<T, A extends unknown[]> {\n\tinstance: T;\n\treset?: Reset<A>;\n\trelease?: Release;\n}\n\n// Pool registry for centralized access via getPool/getTotalPoolSize\nconst pools: Record<string, Pool<any, any[]>> = {};\n\n/**\n * Register a pool instance to the pool registry.\n * @ignore\n */\nexport const registerPool = (key: string, pool: Pool<any, any[]>) => {\n\tpools[key] = pool;\n};\n\n/**\n * @ignore\n */\nexport const getRegisteredPools = () => pools;\n\nexport const createPool = <T, A extends unknown[]>(\n\toptions: (...args: A) => CreatePoolOptions<T, A>,\n): Pool<T, A> => {\n\tconst available = new Set<T>();\n\tconst instanceResetMethods = new Map<T, Reset<A>>();\n\tconst instanceReleaseMethods = new Map<T, Release>();\n\tlet inUse: number = 0;\n\n\treturn {\n\t\t/**\n\t\t * release an object back to the pool\n\t\t * @param instance The object to release.\n\t\t */\n\t\trelease: (instance: T) => {\n\t\t\tif (available.has(instance)) {\n\t\t\t\tthrow new Error(\"Instance is already in pool.\");\n\t\t\t}\n\t\t\tconst release = instanceReleaseMethods.get(instance);\n\t\t\trelease?.();\n\t\t\tavailable.add(instance);\n\t\t\tinUse--;\n\t\t},\n\t\t/**\n\t\t * get an instance from the pool\n\t\t * @param args The arguments for creating the instance.\n\t\t */\n\t\tget: (...args) => {\n\t\t\tconst object = takeFromSet(available);\n\t\t\tif (object) {\n\t\t\t\tconst reset = instanceResetMethods.get(object);\n\t\t\t\treset?.(...args);\n\t\t\t\tinUse++;\n\t\t\t\treturn object;\n\t\t\t} else {\n\t\t\t\tconst { instance, reset, release } = options(...args);\n\t\t\t\tinstanceResetMethods.set(instance, reset);\n\t\t\t\tinstanceReleaseMethods.set(instance, release);\n\t\t\t\tinUse++;\n\t\t\t\treturn instance;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * purge the pool\n\t\t */\n\t\tpurge: () => {\n\t\t\tavailable.clear();\n\t\t\tinUse = 0;\n\t\t},\n\t\t/**\n\t\t * get the current size of the pool (how many objects are available)\n\t\t */\n\t\tsize: () => {\n\t\t\treturn available.size;\n\t\t},\n\t\t/**\n\t\t * get the number of objects currently in use\n\t\t */\n\t\tused: () => {\n\t\t\treturn inUse;\n\t\t},\n\t};\n};\n", "/**\n * a collection of math utility functions\n * @namespace math\n */\n\n/**\n * constant to convert from degrees to radians\n */\nexport const DEG_TO_RAD = Math.PI / 180.0;\n\n/**\n * constant to convert from radians to degrees\n */\nexport const RAD_TO_DEG = 180.0 / Math.PI;\n\n/**\n * constant equals to 2 times pi\n */\nexport const TAU = Math.PI * 2;\n\n/**\n * constant equals to half pi\n */\nexport const ETA = Math.PI * 0.5;\n\n/**\n * the difference between 1 and the smallest floating point number greater than 1\n */\nexport const EPSILON = 0.000001;\n\n/**\n * returns true if the given value is a power of two\n * @param val number to test\n * @returns true if number is a power of two\n */\nexport function isPowerOfTwo(val: number) {\n\treturn (val & (val - 1)) === 0;\n}\n\n/**\n * returns true if the given value is a power of four\n * @param val number to test\n * @returns true if number is a power of four\n */\nexport function isPowerOfFour(val: number) {\n\tif (val === 0 || val === 2 || val === 3) {\n\t\treturn false;\n\t}\n\tif (val === 1) {\n\t\treturn true;\n\t}\n\n\tif ((val & (val - 1)) === 0) {\n\t\tif ((val & 0xaaaaaaaa) === 0) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * returns the next power of two for the given value\n * @param val any number\n * @returns next power of two relative to the given number\n */\nexport function nextPowerOfTwo(val: number) {\n\tval--;\n\tval |= val >> 1;\n\tval |= val >> 2;\n\tval |= val >> 4;\n\tval |= val >> 8;\n\tval |= val >> 16;\n\tval++;\n\treturn val;\n}\n\n/**\n * Converts an angle in degrees to an angle in radians\n * @param angle - angle in degrees\n * @returns corresponding angle in radians\n * @example\n * // convert a specific angle\n * math.degToRad(60); // return 1.0471...\n */\nexport function degToRad(angle: number) {\n\treturn angle * DEG_TO_RAD;\n}\n\n/**\n * Converts an angle in radians to an angle in degrees.\n * @param radians - angle in radians\n * @returns corresponding angle in degrees\n * @example\n * // convert a specific angle\n * math.radToDeg(1.0471975511965976); // return 60\n */\nexport function radToDeg(radians: number) {\n\treturn radians * RAD_TO_DEG;\n}\n\n/**\n * clamp the given value\n * @param val - the value to clamp\n * @param low - lower limit\n * @param high - higher limit\n * @returns clamped value\n */\nexport function clamp(val: number, low: number, high: number) {\n\treturn val < low ? low : val > high ? high : val;\n}\n\n/**\n * return a random integer between min (included) and max (excluded)\n * @param min - minimum value.\n * @param max - maximum value.\n * @returns random value\n * @example\n * // Print a random number; one of 5, 6, 7, 8, 9\n * console.log(math.random(5, 10));\n */\nexport function random(min: number, max: number) {\n\treturn ~~(Math.random() * (max - min)) + min;\n}\n\n/**\n * return a random float between min, max (exclusive)\n * @param min - minimum value.\n * @param max - maximum value.\n * @returns random value\n * @example\n * // Print a random number; one of 5, 6, 7, 8, 9\n * console.log(math.randomFloat(5, 10) );\n */\nexport function randomFloat(min: number, max: number) {\n\treturn Math.random() * (max - min) + min;\n}\n\n/**\n * return a weighted random between min, max (exclusive)\n * @param min - minimum value.\n * @param max - maximum value.\n * @returns random value\n * @example\n * // Print a random number; one of 5, 6, 7, 8, 9\n * console.log(math.weightedRandom(5, 10) );\n */\nexport function weightedRandom(min: number, max: number) {\n\treturn ~~(Math.pow(Math.random(), 2) * (max - min)) + min;\n}\n\n/**\n * round a value to the specified number of digit\n * @param num - value to be rounded.\n * @param [dec] - number of decimal digit to be rounded to.\n * @returns rounded value\n * @example\n * // round a specific value to 2 digits\n * math.round(10.33333, 2); // return 10.33\n */\nexport function round(num: number, dec = 0) {\n\t// if only one argument use the object value\n\tconst powres = Math.pow(10, dec);\n\treturn ~~(0.5 + num * powres) / powres;\n}\n\n/**\n * check if the given value is close to the expected one\n * @param expected - value to be compared with.\n * @param actual - actual value to compare\n * @param [precision] - float precision for the comparison\n * @returns if close to\n * @example\n * // test if the given value is close to 10\n * if (math.toBeCloseTo(10, value)) {\n * // do something\n * }\n */\nexport function toBeCloseTo(expected: number, actual: number, precision = 2) {\n\treturn Math.abs(expected - actual) < Math.pow(10, -precision) / 2;\n}\n\n/**\n * Calculates the power of a number.\n * @param n - The number to be raised to the power of 2.\n * @returns The result of raising the number to the power of 2.\n */\nexport function pow(n: number) {\n\treturn Math.pow(n, 2);\n}\n", "import { createPool } from \"../system/pool.ts\";\nimport { XYPoint } from \"../utils/types.ts\";\nimport { clamp } from \"./math.ts\";\n\n/**\n * a generic 2D Vector Object\n */\nexport class Vector2d {\n\tx: number;\n\ty: number;\n\n\t/**\n\t * @param [x] - x value of the vector\n\t * @param [y] - y value of the vector\n\t */\n\tconstructor(x: number | undefined = 0, y: number | undefined = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t * @param [x] - x value of the vector\n\t * @param [y] - y value of the vector\n\t * @ignore\n\t */\n\tonResetEvent(x = 0, y = 0) {\n\t\t/**\n\t\t * x value of the vector\n\t\t */\n\t\tthis.x = x;\n\t\t/**\n\t\t * y value of the vector\n\t\t */\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to the given values\n\t * @param x - x component of the vector\n\t * @param y - y component of the vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tset(x: number, y: number) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to 0\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetZero() {\n\t\treturn this.set(0, 0);\n\t}\n\n\t/**\n\t * set the Vector x and y properties using the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetV(v: Vector2d) {\n\t\treturn this.set(v.x, v.y);\n\t}\n\n\t/**\n\t * Add the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tadd(v: Vector2d) {\n\t\treturn this.set(this.x + v.x, this.y + v.y);\n\t}\n\n\t/**\n\t * Substract the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsub(v: Vector2d) {\n\t\treturn this.set(this.x - v.x, this.y - v.y);\n\t}\n\n\t/**\n\t * Multiply this vector values by the given scalar\n\t * @param x x scale value\n\t * @param [y] y scale value, if not passed, it uses the x value\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x) {\n\t\treturn this.set(this.x * x, this.y * y);\n\t}\n\n\t/**\n\t * Convert this vector into isometric coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\ttoIso() {\n\t\treturn this.set(this.x - this.y, (this.x + this.y) * 0.5);\n\t}\n\n\t/**\n\t * Convert this vector into 2d coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\tto2d() {\n\t\treturn this.set(this.y + this.x / 2, this.y - this.x / 2);\n\t}\n\n\t/**\n\t * Multiply this vector values by the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector2d) {\n\t\treturn this.set(this.x * v.x, this.y * v.y);\n\t}\n\n\t/**\n\t * Divide this vector values by the passed value\n\t * @param n - the value to divide the vector by\n\t * @returns Reference to this object for method chaining\n\t */\n\tdiv(n: number) {\n\t\treturn this.set(this.x / n, this.y / n);\n\t}\n\n\t/**\n\t * Update this vector values to absolute values\n\t * @returns Reference to this object for method chaining\n\t */\n\tabs() {\n\t\treturn this.set(\n\t\t\tthis.x < 0 ? -this.x : this.x,\n\t\t\tthis.y < 0 ? -this.y : this.y,\n\t\t);\n\t}\n\n\t/**\n\t * Clamp the vector value within the specified value range\n\t * @param low minimum component value\n\t * @param high maximum component value\n\t * @returns new me.Vector2d\n\t */\n\tclamp(low: number, high: number) {\n\t\treturn new Vector2d(clamp(this.x, low, high), clamp(this.y, low, high));\n\t}\n\n\t/**\n\t * Clamp this vector value within the specified value range\n\t * @param low minimum component value\n\t * @param high maximum component value\n\t * @returns Reference to this object for method chaining\n\t */\n\tclampSelf(low: number, high: number) {\n\t\treturn this.set(clamp(this.x, low, high), clamp(this.y, low, high));\n\t}\n\n\t/**\n\t * Update this vector with the minimum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tminV(v: Vector2d) {\n\t\treturn this.set(this.x < v.x ? this.x : v.x, this.y < v.y ? this.y : v.y);\n\t}\n\n\t/**\n\t * Update this vector with the maximum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tmaxV(v: Vector2d) {\n\t\treturn this.set(this.x > v.x ? this.x : v.x, this.y > v.y ? this.y : v.y);\n\t}\n\n\t/**\n\t * Floor the vector values\n\t * @returns new Vector2d\n\t */\n\tfloor() {\n\t\treturn new Vector2d(Math.floor(this.x), Math.floor(this.y));\n\t}\n\n\t/**\n\t * Floor this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tfloorSelf() {\n\t\treturn this.set(Math.floor(this.x), Math.floor(this.y));\n\t}\n\n\t/**\n\t * Ceil the vector values\n\t * @returns new Vector2d\n\t */\n\tceil() {\n\t\treturn new Vector2d(Math.ceil(this.x), Math.ceil(this.y));\n\t}\n\n\t/**\n\t * Ceil this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tceilSelf() {\n\t\treturn this.set(Math.ceil(this.x), Math.ceil(this.y));\n\t}\n\n\t/**\n\t * Negate the vector values\n\t * @returns new Vector2d\n\t */\n\tnegate() {\n\t\treturn new Vector2d(-this.x, -this.y);\n\t}\n\n\t/**\n\t * Negate this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tnegateSelf() {\n\t\treturn this.set(-this.x, -this.y);\n\t}\n\n\t/**\n\t * Copy the x,y values of the passed vector to this one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(v: Vector2d) {\n\t\treturn this.set(v.x, v.y);\n\t}\n\n\t/**\n\t * Checks if this vector is equal to another vector or a pair of coordinates.\n\t * @param args - Either two numbers representing x and y coordinates or a single Vector2d object.\n\t * @returns True if the coordinates are equal, false otherwise.\n\t * @example\n\t * let v1 = new Vector2d(3, 4);\n\t * let v2 = new Vector2d(3, 4);\n\t * v1.equals(v2); // returns true\n\t * @example\n\t * let v = new Vector2d(3, 4);\n\t * v.equals(3, 4); // returns true\n\t */\n\tequals(...args: [number, number] | [Vector2d | XYPoint]) {\n\t\tif (args.length === 2) {\n\t\t\treturn this.x === args[0] && this.y === args[1];\n\t\t}\n\t\treturn this.x === args[0].x && this.y === args[0].y;\n\t}\n\n\t/**\n\t * normalize this vector (scale the vector so that its magnitude is 1)\n\t * @returns Reference to this object for method chaining\n\t */\n\tnormalize() {\n\t\treturn this.div(this.length() || 1);\n\t}\n\n\t/**\n\t * change this vector to be perpendicular to what it was before.<br>\n\t * (Effectively rotates it 90 degrees in a clockwise direction)\n\t * @returns Reference to this object for method chaining\n\t */\n\tperp() {\n\t\treturn this.set(this.y, -this.x);\n\t}\n\n\t/**\n\t * Rotate this vector (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: XYPoint) {\n\t\tlet cx = 0;\n\t\tlet cy = 0;\n\n\t\tif (v) {\n\t\t\tcx = v.x;\n\t\t\tcy = v.y;\n\t\t}\n\n\t\tconst x = this.x - cx;\n\t\tconst y = this.y - cy;\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\n\t\treturn this.set(x * c - y * s + cx, x * s + y * c + cy);\n\t}\n\n\t/**\n\t * return the dot product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The dot product.\n\t */\n\tdot(v: Vector2d) {\n\t\treturn this.x * v.x + this.y * v.y;\n\t}\n\n\t/**\n\t * return the cross product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The cross product.\n\t */\n\tcross(v: Vector2d) {\n\t\treturn this.x * v.y - this.y * v.x;\n\t}\n\n\t/**\n\t * return the square length of this vector\n\t * @returns The length^2 of this vector.\n\t */\n\tlength2() {\n\t\treturn this.dot(this);\n\t}\n\n\t/**\n\t * return the length (magnitude) of this vector\n\t * @returns the length of this vector\n\t */\n\tlength() {\n\t\treturn Math.sqrt(this.length2());\n\t}\n\n\t/**\n\t * Linearly interpolate between this vector and the given one.\n\t * @param v other vector\n\t * @param alpha - distance along the line (alpha = 0 will be this vector, and alpha = 1 will be the given one).\n\t * @returns Reference to this object for method chaining\n\t */\n\tlerp(v: Vector2d, alpha: number) {\n\t\tthis.x += (v.x - this.x) * alpha;\n\t\tthis.y += (v.y - this.y) * alpha;\n\t\treturn this;\n\t}\n\n\t/**\n\t * interpolate the position of this vector towards the given one by the given maximum step.\n\t * @param target vector to rotate towards\n\t * @param step - the maximum step per iteration (Negative values will push the vector away from the target)\n\t * @returns Reference to this object for method chaining\n\t */\n\tmoveTowards(target: Vector2d, step: number) {\n\t\tconst angle = Math.atan2(target.y - this.y, target.x - this.x);\n\n\t\tconst distance = this.distance(target);\n\n\t\tif (distance === 0 || (step >= 0 && distance <= step * step)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tthis.x += Math.cos(angle) * step;\n\t\tthis.y += Math.sin(angle) * step;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the Euclidean distance between this vector and another vector.\n\t * @param v - The vector to which the distance is calculated.\n\t * @returns The Euclidean distance between this vector and the given vector.\n\t * @example\n\t * let v1 = new Vector2d(3, 4);\n\t * let v2 = new Vector2d(6, 8);\n\t * v1.distance(v2); // returns 5\n\t */\n\tdistance(v: Vector2d) {\n\t\tconst dx = this.x - v.x;\n\t\tconst dy = this.y - v.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t/**\n\t * return the angle between this vector and the passed one\n\t * @param v other vector\n\t * @returns angle in radians\n\t */\n\tangle(v: Vector2d) {\n\t\treturn Math.acos(clamp(this.dot(v) / (this.length() * v.length()), -1, 1));\n\t}\n\n\t/**\n\t * project this vector on to another vector.\n\t * @param v - The vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tproject(v: Vector2d) {\n\t\treturn this.scale(this.dot(v) / v.length2());\n\t}\n\n\t/**\n\t * Project this vector onto a vector of unit length.<br>\n\t * This is slightly more efficient than `project` when dealing with unit vectors.\n\t * @param v - The unit vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tprojectN(v: Vector2d) {\n\t\treturn this.scale(this.dot(v));\n\t}\n\n\t/**\n\t * return a clone copy of this vector\n\t * @returns new Vector2d\n\t */\n\tclone() {\n\t\treturn vector2dPool.get(this.x, this.y);\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns stringified representation of this vector\n\t */\n\ttoString() {\n\t\treturn `x:${this.x},y:${this.y}` as const;\n\t}\n}\n\nexport const vector2dPool = createPool<\n\tVector2d,\n\t[x?: number | undefined, y?: number | undefined]\n>((x, y) => {\n\tconst vector = new Vector2d(x, y);\n\n\treturn {\n\t\tinstance: vector,\n\t\treset(x = 0, y = 0) {\n\t\t\tvector.x = x;\n\t\t\tvector.y = y;\n\t\t},\n\t};\n});\n", "import { createPool } from \"../system/pool\";\n\n/**\n * represents a point in a 2d space\n */\nexport class Point {\n\t/**\n\t * the position of the point on the horizontal axis\n\t * @default 0\n\t */\n\tx: number;\n\n\t/**\n\t * the position of the point on the vertical axis\n\t * @default 0\n\t */\n\ty: number;\n\n\t/**\n\t * the shape type (used internally)\n\t * @default \"Point\"\n\t */\n\ttype: \"Point\";\n\n\tconstructor(x?: number, y?: number) {\n\t\tthis.x = x ?? 0;\n\t\tthis.y = y ?? 0;\n\t\tthis.type = \"Point\";\n\t}\n\n\t/**\n\t * set the Point x and y properties to the given values\n\t * @param x horizontal coordinate\n\t * @param y vertical coordinate\n\t * @returns Reference to this object for method chaining\n\t */\n\tset(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\t/**\n\t * return true if this point is equal to the given point\n\t * @param x horizontal coordinate\n\t * @param [y] vertical coordinate\n\t * @param args\n\t * @returns\n\t */\n\tequals(x: number, y: number): boolean;\n\tequals(point: Point): boolean;\n\tequals(xOrPoint: number | Point, y?: number) {\n\t\tif (typeof xOrPoint === \"object\") {\n\t\t\treturn this.x === xOrPoint.x && this.y === xOrPoint.y;\n\t\t}\n\t\treturn this.x === xOrPoint && this.y === y;\n\t}\n\n\t/**\n\t * clone this Point\n\t * @returns new Point\n\t */\n\tclone() {\n\t\treturn new Point(this.x, this.y);\n\t}\n}\n\nexport const pointPool = createPool<\n\tPoint,\n\t[x?: number | undefined, y?: number | undefined]\n>((x, y) => {\n\tconst instance = new Point(x, y);\n\n\treturn {\n\t\tinstance: instance,\n\t\treset(x = 0, y = 0) {\n\t\t\tinstance.x = x;\n\t\t\tinstance.y = y;\n\t\t},\n\t};\n});\n", "import { Point, pointPool } from \"../geometries/point.ts\";\nimport { polygonPool } from \"../geometries/polygon.ts\";\nimport { Matrix2d } from \"../math/matrix2d.ts\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { XYPoint } from \"../utils/types.ts\";\n\n/**\n * a bound object contains methods for creating and manipulating axis-aligned bounding boxes (AABB).\n */\nexport class Bounds {\n\t_center: Vector2d;\n\ttype: \"Bounds\";\n\tmin: XYPoint;\n\tmax: XYPoint;\n\n\t/**\n\t * Constructs a Bounds object with optional vertices.\n\t * @param [vertices] - An array of Vector2d or Point to initialize the bounds.\n\t */\n\tconstructor(vertices?: Vector2d[] | Point[] | XYPoint[]) {\n\t\tthis._center = new Vector2d();\n\t\tthis.type = \"Bounds\";\n\t\tthis.min = { x: Infinity, y: Infinity };\n\t\tthis.max = { x: -Infinity, y: -Infinity };\n\t\tif (vertices) {\n\t\t\tthis.update(vertices);\n\t\t}\n\t}\n\n\t/**\n\t * Resets the bounds to its initial state.\n\t */\n\tclear() {\n\t\tthis.setMinMax(Infinity, Infinity, -Infinity, -Infinity);\n\t}\n\n\t/**\n\t * Sets the bounds to the given minimum and maximum values.\n\t * @param minX - The minimum x value.\n\t * @param minY - The minimum y value.\n\t * @param maxX - The maximum x value.\n\t * @param maxY - The maximum y value.\n\t */\n\tsetMinMax(minX: number, minY: number, maxX: number, maxY: number) {\n\t\tthis.min.x = minX;\n\t\tthis.min.y = minY;\n\n\t\tthis.max.x = maxX;\n\t\tthis.max.y = maxY;\n\t}\n\n\t/**\n\t * Gets the x position of the bounds.\n\t * @returns The x position.\n\t */\n\tget x() {\n\t\treturn this.min.x;\n\t}\n\n\t/**\n\t * Sets the x position of the bounds.\n\t * @param value - The new x position.\n\t */\n\tset x(value) {\n\t\tconst deltaX = this.max.x - this.min.x;\n\t\tthis.min.x = value;\n\t\tthis.max.x = value + deltaX;\n\t}\n\n\t/**\n\t * Gets the y position of the bounds.\n\t * @returns The y position.\n\t */\n\tget y() {\n\t\treturn this.min.y;\n\t}\n\n\t/**\n\t * Sets the y position of the bounds.\n\t * @param value - The new y position.\n\t */\n\tset y(value) {\n\t\tconst deltaY = this.max.y - this.min.y;\n\n\t\tthis.min.y = value;\n\t\tthis.max.y = value + deltaY;\n\t}\n\n\t/**\n\t * Gets the width of the bounds.\n\t * @returns The width.\n\t */\n\tget width() {\n\t\treturn this.max.x - this.min.x;\n\t}\n\n\t/**\n\t * Sets the width of the bounds.\n\t * @param value - The new width.\n\t */\n\tset width(value) {\n\t\tthis.max.x = this.min.x + value;\n\t}\n\n\t/**\n\t * Gets the height of the bounds.\n\t * @returns The height.\n\t */\n\tget height() {\n\t\treturn this.max.y - this.min.y;\n\t}\n\n\t/**\n\t * Sets the height of the bounds.\n\t * @param value - The new height.\n\t */\n\tset height(value) {\n\t\tthis.max.y = this.min.y + value;\n\t}\n\n\t/**\n\t * Gets the left coordinate of the bounds.\n\t * @returns The left coordinate.\n\t */\n\tget left() {\n\t\treturn this.min.x;\n\t}\n\n\t/**\n\t * Gets the right coordinate of the bounds.\n\t * @returns The right coordinate.\n\t */\n\tget right() {\n\t\treturn this.max.x;\n\t}\n\n\t/**\n\t * Gets the top coordinate of the bounds.\n\t * @returns The top coordinate.\n\t */\n\tget top() {\n\t\treturn this.min.y;\n\t}\n\n\t/**\n\t * Gets the bottom coordinate of the bounds.\n\t * @returns The bottom coordinate.\n\t */\n\tget bottom() {\n\t\treturn this.max.y;\n\t}\n\n\t/**\n\t * Gets the center position of the bounds on the x axis.\n\t * @returns The center x coordinate.\n\t */\n\tget centerX() {\n\t\treturn this.min.x + this.width / 2;\n\t}\n\n\t/**\n\t * Gets the center position of the bounds on the y axis.\n\t * @returns The center y coordinate.\n\t */\n\tget centerY() {\n\t\treturn this.min.y + this.height / 2;\n\t}\n\n\t/**\n\t * Gets the center position of the bounds.\n\t * @returns The center position as a Vector2d.\n\t */\n\tget center() {\n\t\treturn this._center.set(this.centerX, this.centerY);\n\t}\n\n\t/**\n\t * Centers the bounds position around the given coordinates.\n\t * @param x - The x coordinate to center around.\n\t * @param y - The y coordinate to center around.\n\t * @returns The current Bounds instance for method chaining.\n\t */\n\tcenterOn(x: number, y: number) {\n\t\tthis.shift(x - this.width / 2, y - this.height / 2);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the bounds using the given vertices.\n\t * @param vertices - An array of Vector2d or Point to update the bounds.\n\t */\n\tupdate(vertices: Vector2d[] | Point[] | XYPoint[]) {\n\t\tthis.add(vertices, true);\n\t}\n\n\t/**\n\t * Adds the given vertices to the bounds definition.\n\t * @param vertices - An array of Vector2d or Point to add to the bounds.\n\t * @param [clear] - Whether to reset the bounds before adding the new vertices. Defaults to false.\n\t */\n\tadd(vertices: Vector2d[] | Point[] | XYPoint[], clear = false) {\n\t\tif (clear) {\n\t\t\tthis.clear();\n\t\t}\n\t\tfor (const vertex of vertices) {\n\t\t\tif (vertex.x > this.max.x) {\n\t\t\t\tthis.max.x = vertex.x;\n\t\t\t}\n\t\t\tif (vertex.x < this.min.x) {\n\t\t\t\tthis.min.x = vertex.x;\n\t\t\t}\n\t\t\tif (vertex.y > this.max.y) {\n\t\t\t\tthis.max.y = vertex.y;\n\t\t\t}\n\t\t\tif (vertex.y < this.min.y) {\n\t\t\t\tthis.min.y = vertex.y;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adds the given bounds to the bounds definition.\n\t * @param bounds - The bounds to add.\n\t * @param [clear] - Whether to reset the bounds before adding the new bounds.\n\t */\n\taddBounds(bounds: Bounds, clear = false) {\n\t\tif (clear) {\n\t\t\tthis.max.x = bounds.max.x;\n\t\t\tthis.min.x = bounds.min.x;\n\t\t\tthis.max.y = bounds.max.y;\n\t\t\tthis.min.y = bounds.min.y;\n\t\t} else {\n\t\t\tif (bounds.max.x > this.max.x) {\n\t\t\t\tthis.max.x = bounds.max.x;\n\t\t\t}\n\t\t\tif (bounds.min.x < this.min.x) {\n\t\t\t\tthis.min.x = bounds.min.x;\n\t\t\t}\n\t\t\tif (bounds.max.y > this.max.y) {\n\t\t\t\tthis.max.y = bounds.max.y;\n\t\t\t}\n\t\t\tif (bounds.min.y < this.min.y) {\n\t\t\t\tthis.min.y = bounds.min.y;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adds the given point to the bounds definition.\n\t * @param point - The point to add to the bounds.\n\t * @param [m] - An optional transform to apply to the given point.\n\t */\n\taddPoint(point: Vector2d | Point, m?: Matrix2d) {\n\t\tconst p = m ? m.apply(point) : point;\n\t\tthis.min.x = Math.min(this.min.x, p.x);\n\t\tthis.max.x = Math.max(this.max.x, p.x);\n\t\tthis.min.y = Math.min(this.min.y, p.y);\n\t\tthis.max.y = Math.max(this.max.y, p.y);\n\t}\n\n\t/**\n\t * Adds the given quad coordinates to this bounds definition, multiplied by the given matrix.\n\t * @param x0 - The left x coordinate of the quad.\n\t * @param y0 - The top y coordinate of the quad.\n\t * @param x1 - The right x coordinate of the quad.\n\t * @param y1 - The bottom y coordinate of the quad.\n\t * @param [m] - An optional transform to apply to the given coordinates.\n\t */\n\taddFrame(x0: number, y0: number, x1: number, y1: number, m?: Matrix2d) {\n\t\tconst v = pointPool.get();\n\n\t\tthis.addPoint(v.set(x0, y0), m);\n\t\tthis.addPoint(v.set(x1, y0), m);\n\t\tthis.addPoint(v.set(x0, y1), m);\n\t\tthis.addPoint(v.set(x1, y1), m);\n\n\t\tpointPool.release(v);\n\t}\n\n\t/**\n\t * Returns true if the bounds contain the given point or vector.\n\t * @param xOrVectorOrBounds - The x coordinate, vector, or bounds to check.\n\t * @param [y] - The y coordinate if the first parameter is a number.\n\t * @returns True if the bounds contain the point or vector, otherwise false.\n\t */\n\tcontains(x: number, y: number): boolean;\n\tcontains(vector: Vector2d | Bounds): boolean;\n\tcontains(xOrVectorOrBounds: Bounds | Vector2d | number, y?: number) {\n\t\tlet _x1: number;\n\t\tlet _x2: number;\n\t\tlet _y1: number;\n\t\tlet _y2: number;\n\t\tif (xOrVectorOrBounds instanceof Vector2d) {\n\t\t\t_x1 = _x2 = xOrVectorOrBounds.x;\n\t\t\t_y1 = _y2 = xOrVectorOrBounds.y;\n\t\t} else if (xOrVectorOrBounds instanceof Bounds) {\n\t\t\t_x1 = xOrVectorOrBounds.min.x;\n\t\t\t_x2 = xOrVectorOrBounds.max.x;\n\t\t\t_y1 = xOrVectorOrBounds.min.y;\n\t\t\t_y2 = xOrVectorOrBounds.max.y;\n\t\t} else {\n\t\t\t_x1 = _x2 = xOrVectorOrBounds;\n\t\t\t_y1 = _y2 = y!;\n\t\t}\n\n\t\treturn (\n\t\t\t_x1 >= this.min.x &&\n\t\t\t_x2 <= this.max.x &&\n\t\t\t_y1 >= this.min.y &&\n\t\t\t_y2 <= this.max.y\n\t\t);\n\t}\n\n\t/**\n\t * Returns true if the two bounds intersect.\n\t * @param bounds - The bounds to check for intersection.\n\t * @returns True if the bounds overlap, otherwise false.\n\t */\n\toverlaps(bounds: Bounds) {\n\t\treturn !(\n\t\t\tthis.right < bounds.left ||\n\t\t\tthis.left > bounds.right ||\n\t\t\tthis.bottom < bounds.top ||\n\t\t\tthis.top > bounds.bottom\n\t\t);\n\t}\n\n\t/**\n\t * Determines whether all coordinates of this bounds are finite numbers.\n\t * @returns False if any coordinates are positive or negative Infinity or NaN; otherwise, true.\n\t */\n\tisFinite() {\n\t\treturn (\n\t\t\tisFinite(this.min.x) &&\n\t\t\tisFinite(this.max.x) &&\n\t\t\tisFinite(this.min.y) &&\n\t\t\tisFinite(this.max.y)\n\t\t);\n\t}\n\n\t/**\n\t * Translates the bounds by the given point or vector.\n\t * @param xOrVector - The x coordinate or vector to translate by.\n\t * @param [y] - The y coordinate if the first parameter is a number.\n\t */\n\ttranslate(x: number, y: number): void;\n\ttranslate(vector: Vector2d): void;\n\ttranslate(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\t\tthis.min.x += _x;\n\t\tthis.max.x += _x;\n\t\tthis.min.y += _y;\n\t\tthis.max.y += _y;\n\t}\n\n\t/**\n\t * Shifts the bounds to the given x, y position or vector.\n\t * @param xOrVector - The x coordinate or vector to shift to.\n\t * @param [y] - The y coordinate if the first parameter is a number.\n\t */\n\tshift(x: number, y: number): void;\n\tshift(vector: Vector2d): void;\n\tshift(xOrVector: number | Vector2d, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\tconst deltaX = this.max.x - this.min.x;\n\t\tconst deltaY = this.max.y - this.min.y;\n\n\t\tthis.min.x = _x;\n\t\tthis.max.x = _x + deltaX;\n\t\tthis.min.y = _y;\n\t\tthis.max.y = _y + deltaY;\n\t}\n\n\t/**\n\t * Creates a clone of this bounds.\n\t * @returns A new Bounds object that is a copy of this bounds.\n\t */\n\tclone() {\n\t\tconst bounds = new Bounds();\n\t\tbounds.addBounds(this);\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * Returns a polygon whose edges are the same as this bounds.\n\t * @returns A new Polygon that represents this bounds.\n\t */\n\ttoPolygon() {\n\t\treturn polygonPool.get(this.x, this.y, [\n\t\t\tnew Vector2d(0, 0),\n\t\t\tnew Vector2d(this.width, 0),\n\t\t\tnew Vector2d(this.width, this.height),\n\t\t\tnew Vector2d(0, this.height),\n\t\t]);\n\t}\n}\n\n/**\n * A pool for creating and reusing Bounds objects.\n */\nexport const boundsPool = createPool<\n\tBounds,\n\t[vertices?: Vector2d[] | Point[] | undefined]\n>((vertices) => {\n\tconst instance = new Bounds(vertices);\n\treturn {\n\t\tinstance,\n\t\treset(vertices) {\n\t\t\tinstance.clear();\n\t\t\tif (vertices) {\n\t\t\t\tinstance.update(vertices);\n\t\t\t}\n\t\t},\n\t};\n});\n", "export function earcut(\n\tdata: number[],\n\tholeIndices?: number[] | null,\n\tdim: number | undefined = 2,\n): number[] {\n\tconst hasHoles = holeIndices && holeIndices.length;\n\tconst outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\tlet outerNode = linkedList(data, 0, outerLen, dim, true);\n\tconst triangles: number[] = [];\n\n\tif (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n\tlet minX, minY, invSize;\n\n\tif (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\tif (data.length > 80 * dim) {\n\t\tminX = Infinity;\n\t\tminY = Infinity;\n\t\tlet maxX = -Infinity;\n\t\tlet maxY = -Infinity;\n\n\t\tfor (let i = dim; i < outerLen; i += dim) {\n\t\t\tconst x = data[i];\n\t\t\tconst y = data[i + 1];\n\t\t\tif (x < minX) minX = x;\n\t\t\tif (y < minY) minY = y;\n\t\t\tif (x > maxX) maxX = x;\n\t\t\tif (y > maxY) maxY = y;\n\t\t}\n\n\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\tinvSize = Math.max(maxX - minX, maxY - minY);\n\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\t}\n\n\tearcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n\treturn triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(\n\tdata: number[],\n\tstart: number,\n\tend: number,\n\tdim: number,\n\tclockwise: boolean,\n) {\n\tlet last: Node | null = null;\n\n\tif (clockwise === signedArea(data, start, end, dim) > 0) {\n\t\tfor (let i = start; i < end; i += dim) {\n\t\t\tlast = insertNode((i / dim) | 0, data[i], data[i + 1], last);\n\t\t}\n\t} else {\n\t\tfor (let i = end - dim; i >= start; i -= dim) {\n\t\t\tlast = insertNode((i / dim) | 0, data[i], data[i + 1], last);\n\t\t}\n\t}\n\n\tif (last && equals(last, last.next)) {\n\t\tremoveNode(last);\n\t\tlast = last.next;\n\t}\n\n\treturn last!;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start: null, end?: Node | null): null;\nfunction filterPoints(start: Node, end?: Node | null): Node;\nfunction filterPoints(start: Node | null, end?: Node | null) {\n\tif (!start) return start;\n\tif (!end) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\t\tagain = false;\n\n\t\tif (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t\t\tremoveNode(p);\n\t\t\tp = end = p.prev;\n\t\t\tif (p === p.next) break;\n\t\t\tagain = true;\n\t\t} else {\n\t\t\tp = p.next;\n\t\t}\n\t} while (again || p !== end);\n\n\treturn end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(\n\tear: Node,\n\ttriangles: number[],\n\tdim: number,\n\tminX: number | undefined,\n\tminY: number | undefined,\n\tinvSize: number | undefined,\n\tpass: number,\n) {\n\tif (!ear) return;\n\n\t// interlink polygon nodes in z-order\n\tif (!pass && invSize) indexCurve(ear, minX!, minY!, invSize);\n\n\tlet stop = ear;\n\n\t// iterate through ears, slicing them one by one\n\twhile (ear.prev !== ear.next) {\n\t\tconst prev = ear.prev;\n\t\tconst next = ear.next;\n\n\t\tif (invSize ? isEarHashed(ear, minX!, minY!, invSize) : isEar(ear)) {\n\t\t\ttriangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n\t\t\tremoveNode(ear);\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif (ear === stop) {\n\t\t\t// try filtering points and slicing again\n\t\t\tif (!pass) {\n\t\t\t\tearcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\t\t\t} else if (pass === 1) {\n\t\t\t\tear = cureLocalIntersections(filterPoints(ear), triangles);\n\t\t\t\tearcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\t\t\t} else if (pass === 2) {\n\t\t\t\tsplitEarcut(ear, triangles, dim, minX, minY, invSize);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear: Node) {\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x,\n\t\tbx = b.x,\n\t\tcx = c.x,\n\t\tay = a.y,\n\t\tby = b.y,\n\t\tcy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? (ax < cx ? ax : cx) : bx < cx ? bx : cx,\n\t\ty0 = ay < by ? (ay < cy ? ay : cy) : by < cy ? by : cy,\n\t\tx1 = ax > bx ? (ax > cx ? ax : cx) : bx > cx ? bx : cx,\n\t\ty1 = ay > by ? (ay > cy ? ay : cy) : by > cy ? by : cy;\n\n\tlet p = c.next;\n\twhile (p !== a) {\n\t\tif (\n\t\t\tp.x >= x0 &&\n\t\t\tp.x <= x1 &&\n\t\t\tp.y >= y0 &&\n\t\t\tp.y <= y1 &&\n\t\t\tpointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0\n\t\t)\n\t\t\treturn false;\n\t\tp = p.next;\n\t}\n\n\treturn true;\n}\n\nfunction isEarHashed(ear: Node, minX: number, minY: number, invSize: number) {\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n\tconst ax = a.x,\n\t\tbx = b.x,\n\t\tcx = c.x,\n\t\tay = a.y,\n\t\tby = b.y,\n\t\tcy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? (ax < cx ? ax : cx) : bx < cx ? bx : cx,\n\t\ty0 = ay < by ? (ay < cy ? ay : cy) : by < cy ? by : cy,\n\t\tx1 = ax > bx ? (ax > cx ? ax : cx) : bx > cx ? bx : cx,\n\t\ty1 = ay > by ? (ay > cy ? ay : cy) : by > cy ? by : cy;\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder(x0, y0, minX, minY, invSize),\n\t\tmaxZ = zOrder(x1, y1, minX, minY, invSize);\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile (p && p.z >= minZ && n && n.z <= maxZ) {\n\t\tif (\n\t\t\tp.x >= x0 &&\n\t\t\tp.x <= x1 &&\n\t\t\tp.y >= y0 &&\n\t\t\tp.y <= y1 &&\n\t\t\tp !== a &&\n\t\t\tp !== c &&\n\t\t\tpointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0\n\t\t)\n\t\t\treturn false;\n\t\tp = p.prevZ;\n\n\t\tif (\n\t\t\tn.x >= x0 &&\n\t\t\tn.x <= x1 &&\n\t\t\tn.y >= y0 &&\n\t\t\tn.y <= y1 &&\n\t\t\tn !== a &&\n\t\t\tn !== c &&\n\t\t\tpointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) &&\n\t\t\tarea(n.prev, n, n.next) >= 0\n\t\t)\n\t\t\treturn false;\n\t\tn = n.nextZ;\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile (p && p.z >= minZ) {\n\t\tif (\n\t\t\tp.x >= x0 &&\n\t\t\tp.x <= x1 &&\n\t\t\tp.y >= y0 &&\n\t\t\tp.y <= y1 &&\n\t\t\tp !== a &&\n\t\t\tp !== c &&\n\t\t\tpointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0\n\t\t)\n\t\t\treturn false;\n\t\tp = p.prevZ;\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile (n && n.z <= maxZ) {\n\t\tif (\n\t\t\tn.x >= x0 &&\n\t\t\tn.x <= x1 &&\n\t\t\tn.y >= y0 &&\n\t\t\tn.y <= y1 &&\n\t\t\tn !== a &&\n\t\t\tn !== c &&\n\t\t\tpointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) &&\n\t\t\tarea(n.prev, n, n.next) >= 0\n\t\t)\n\t\t\treturn false;\n\t\tn = n.nextZ;\n\t}\n\n\treturn true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start: Node, triangles: number[]) {\n\tlet p = start;\n\tdo {\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif (\n\t\t\t!equals(a, b) &&\n\t\t\tintersects(a, p, p.next, b) &&\n\t\t\tlocallyInside(a, b) &&\n\t\t\tlocallyInside(b, a)\n\t\t) {\n\t\t\ttriangles.push(a.i, p.i, b.i);\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode(p);\n\t\t\tremoveNode(p.next);\n\n\t\t\tp = start = b;\n\t\t}\n\t\tp = p.next;\n\t} while (p !== start);\n\n\treturn filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(\n\tstart: Node,\n\ttriangles: number[],\n\tdim: number,\n\tminX: number | undefined,\n\tminY: number | undefined,\n\tinvSize: number | undefined,\n) {\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\t\tlet b = a.next.next;\n\t\twhile (b !== a.prev) {\n\t\t\tif (a.i !== b.i && isValidDiagonal(a, b)) {\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon(a, b);\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints(a, a.next);\n\t\t\t\tc = filterPoints(c, c.next);\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n\t\t\t\tearcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tb = b.next;\n\t\t}\n\t\ta = a.next;\n\t} while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(\n\tdata: number[],\n\tholeIndices: number[],\n\touterNode: Node,\n\tdim: number,\n) {\n\tconst queue = [];\n\n\tfor (let i = 0, len = holeIndices.length; i < len; i++) {\n\t\tconst start = holeIndices[i] * dim;\n\t\tconst end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t\tconst list = linkedList(data, start, end, dim, false);\n\t\tif (list === list.next) list.steiner = true;\n\t\tqueue.push(getLeftmost(list));\n\t}\n\n\tqueue.sort(compareX);\n\n\t// process holes from left to right\n\tfor (let i = 0; i < queue.length; i++) {\n\t\touterNode = eliminateHole(queue[i], outerNode);\n\t}\n\n\treturn outerNode;\n}\n\nfunction compareX(a: Node, b: Node) {\n\treturn a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole: Node, outerNode: Node) {\n\tconst bridge = findHoleBridge(hole, outerNode);\n\tif (!bridge) {\n\t\treturn outerNode;\n\t}\n\n\tconst bridgeReverse = splitPolygon(bridge, hole);\n\n\t// filter collinear points around the cuts\n\tfilterPoints(bridgeReverse, bridgeReverse.next);\n\treturn filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole: Node, outerNode: Node) {\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = -Infinity;\n\tlet m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\t\tif (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n\t\t\tconst x = p.x + ((hy - p.y) * (p.next.x - p.x)) / (p.next.y - p.y);\n\t\t\tif (x <= hx && x > qx) {\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n\t\t\t}\n\t\t}\n\t\tp = p.next;\n\t} while (p !== outerNode);\n\n\tif (!m) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m;\n\tconst mx = m.x;\n\tconst my = m.y;\n\tlet tanMin = Infinity;\n\n\tp = m;\n\n\tdo {\n\t\tif (\n\t\t\thx >= p.x &&\n\t\t\tp.x >= mx &&\n\t\t\thx !== p.x &&\n\t\t\tpointInTriangle(\n\t\t\t\thy < my ? hx : qx,\n\t\t\t\thy,\n\t\t\t\tmx,\n\t\t\t\tmy,\n\t\t\t\thy < my ? qx : hx,\n\t\t\t\thy,\n\t\t\t\tp.x,\n\t\t\t\tp.y,\n\t\t\t)\n\t\t) {\n\t\t\tconst tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n\t\t\tif (\n\t\t\t\tlocallyInside(p, hole) &&\n\t\t\t\t(tan < tanMin ||\n\t\t\t\t\t(tan === tanMin &&\n\t\t\t\t\t\t(p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))\n\t\t\t) {\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\t\t\t}\n\t\t}\n\n\t\tp = p.next;\n\t} while (p !== stop);\n\n\treturn m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m: Node, p: Node) {\n\treturn area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start: Node, minX: number, minY: number, invSize: number) {\n\tlet p = start;\n\tdo {\n\t\tif (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\t} while (p !== start);\n\n\tp.prevZ!.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(head: Node) {\n\tlet numMerges;\n\tlet inSize = 1;\n\n\tlet list: Node | null = head;\n\n\tdo {\n\t\tlet p: Node | null = list;\n\t\tlet e: Node;\n\t\tlist = null;\n\t\tlet tail = null;\n\t\tnumMerges = 0;\n\n\t\twhile (p) {\n\t\t\tnumMerges++;\n\t\t\tlet q: Node | null = p;\n\t\t\tlet pSize = 0;\n\t\t\tfor (let i = 0; i < inSize; i++) {\n\t\t\t\tpSize++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif (!q) break;\n\t\t\t}\n\t\t\tlet qSize = inSize;\n\n\t\t\twhile (pSize > 0 || (qSize > 0 && q)) {\n\t\t\t\tif (pSize !== 0 && (qSize === 0 || !q || p!.z <= q.z)) {\n\t\t\t\t\te = p!;\n\t\t\t\t\tp = p!.nextZ;\n\t\t\t\t\tpSize--;\n\t\t\t\t} else {\n\t\t\t\t\te = q!;\n\t\t\t\t\tq = q!.nextZ;\n\t\t\t\t\tqSize--;\n\t\t\t\t}\n\n\t\t\t\tif (tail) {\n\t\t\t\t\ttail.nextZ = e;\n\t\t\t\t} else {\n\t\t\t\t\tlist = e;\n\t\t\t\t}\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\t\t\t}\n\n\t\t\tp = q;\n\t\t}\n\n\t\ttail!.nextZ = null;\n\t\tinSize *= 2;\n\t} while (numMerges > 1);\n\n\treturn list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(\n\tx: number,\n\ty: number,\n\tminX: number,\n\tminY: number,\n\tinvSize: number,\n) {\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ((x - minX) * invSize) | 0;\n\ty = ((y - minY) * invSize) | 0;\n\n\tx = (x | (x << 8)) & 0x00ff00ff;\n\tx = (x | (x << 4)) & 0x0f0f0f0f;\n\tx = (x | (x << 2)) & 0x33333333;\n\tx = (x | (x << 1)) & 0x55555555;\n\n\ty = (y | (y << 8)) & 0x00ff00ff;\n\ty = (y | (y << 4)) & 0x0f0f0f0f;\n\ty = (y | (y << 2)) & 0x33333333;\n\ty = (y | (y << 1)) & 0x55555555;\n\n\treturn x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start: Node) {\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\t\tif (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y))\n\t\t\tleftmost = p;\n\t\tp = p.next;\n\t} while (p !== start);\n\n\treturn leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(\n\tax: number,\n\tay: number,\n\tbx: number,\n\tby: number,\n\tcx: number,\n\tcy: number,\n\tpx: number,\n\tpy: number,\n) {\n\treturn (\n\t\t(cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n\t\t(ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n\t\t(bx - px) * (cy - py) >= (cx - px) * (by - py)\n\t);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a: Node, b: Node) {\n\treturn (\n\t\ta.next.i !== b.i &&\n\t\ta.prev.i !== b.i &&\n\t\t!intersectsPolygon(a, b) && // dones't intersect other edges\n\t\t((locallyInside(a, b) &&\n\t\t\tlocallyInside(b, a) &&\n\t\t\tmiddleInside(a, b) && // locally visible\n\t\t\t(area(a.prev, a, b.prev) || area(a, b.prev, b))) || // does not create opposite-facing sectors\n\t\t\t(equals(a, b) &&\n\t\t\t\tarea(a.prev, a, a.next) > 0 &&\n\t\t\t\tarea(b.prev, b, b.next) > 0))\n\t); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p: Node, q: Node, r: Node) {\n\treturn (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1: Node, p2: Node) {\n\treturn p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1: Node, q1: Node, p2: Node, q2: Node) {\n\tconst o1 = sign(area(p1, q1, p2));\n\tconst o2 = sign(area(p1, q1, q2));\n\tconst o3 = sign(area(p2, q2, p1));\n\tconst o4 = sign(area(p2, q2, q1));\n\n\tif (o1 !== o2 && o3 !== o4) return true; // general case\n\n\tif (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p: Node, q: Node, r: Node) {\n\treturn (\n\t\tq.x <= Math.max(p.x, r.x) &&\n\t\tq.x >= Math.min(p.x, r.x) &&\n\t\tq.y <= Math.max(p.y, r.y) &&\n\t\tq.y >= Math.min(p.y, r.y)\n\t);\n}\n\nfunction sign(num: number) {\n\treturn num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a: Node, b: Node) {\n\tlet p = a;\n\tdo {\n\t\tif (\n\t\t\tp.i !== a.i &&\n\t\t\tp.next.i !== a.i &&\n\t\t\tp.i !== b.i &&\n\t\t\tp.next.i !== b.i &&\n\t\t\tintersects(p, p.next, a, b)\n\t\t)\n\t\t\treturn true;\n\t\tp = p.next;\n\t} while (p !== a);\n\n\treturn false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a: Node, b: Node) {\n\treturn area(a.prev, a, a.next) < 0\n\t\t? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0\n\t\t: area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a: Node, b: Node) {\n\tlet p = a;\n\tlet inside = false;\n\tconst px = (a.x + b.x) / 2;\n\tconst py = (a.y + b.y) / 2;\n\tdo {\n\t\tif (\n\t\t\tp.y > py !== p.next.y > py &&\n\t\t\tp.next.y !== p.y &&\n\t\t\tpx < ((p.next.x - p.x) * (py - p.y)) / (p.next.y - p.y) + p.x\n\t\t)\n\t\t\tinside = !inside;\n\t\tp = p.next;\n\t} while (p !== a);\n\n\treturn inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a: Node, b: Node) {\n\tconst a2 = createNode(a.i, a.x, a.y),\n\t\tb2 = createNode(b.i, b.x, b.y),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2 as Node;\n\n\tb2.next = a2 as Node;\n\ta2.prev = b2 as Node;\n\n\tbp.next = b2 as Node;\n\tb2.prev = bp;\n\n\treturn b2 as Node;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i: number, x: number, y: number, last: Node | null) {\n\tconst p = createNode(i, x, y) as Node;\n\n\tif (!last) {\n\t\tp.prev = p;\n\t\tp.next = p;\n\t} else {\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\t}\n\treturn p;\n}\n\nfunction removeNode(p: Node) {\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\tif (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\ninterface LooseNode {\n\ti: number;\n\tx: number;\n\ty: number;\n\tprev: Node | null;\n\tnext: Node | null;\n\tz: number;\n\tprevZ: Node | null;\n\tnextZ: Node | null;\n\tsteiner: boolean;\n}\n\ninterface Node extends LooseNode {\n\tprev: Node;\n\tnext: Node;\n}\n\nfunction createNode(i: number, x: number, y: number): LooseNode {\n\treturn {\n\t\ti, // vertex index in coordinates array\n\t\tx,\n\t\ty, // vertex coordinates\n\t\tprev: null, // previous and next vertex nodes in a polygon ring\n\t\tnext: null,\n\t\tz: 0, // z-order curve value\n\t\tprevZ: null, // previous and next nodes in z-order\n\t\tnextZ: null,\n\t\tsteiner: false, // indicates whether this is a steiner point\n\t};\n}\n\nexport function signedArea(\n\tdata: number[],\n\tstart: number,\n\tend: number,\n\tdim: number,\n) {\n\tlet sum = 0;\n\tfor (let i = start, j = end - dim; i < end; i += dim) {\n\t\tsum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t\tj = i;\n\t}\n\treturn sum;\n}\n", "import { Matrix2d } from \"../math/matrix2d.ts\";\nimport { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport { Bounds, boundsPool } from \"../physics/bounds.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { XYPoint } from \"../utils/types.ts\";\nimport { earcut } from \"./earcut.ts\";\n\nexport type PolygonVertices =\n\t| [XYPoint, XYPoint, XYPoint, ...XYPoint[]]\n\t| [Vector2d, Vector2d, Vector2d, ...Vector2d[]]\n\t| [number, number, number, number, number, number, ...number[]];\n\nexport type LineVertices =\n\t| [XYPoint, XYPoint]\n\t| [Vector2d, Vector2d]\n\t| [number, number, number, number];\n\n/**\n * a polygon Object.<br>\n * Please do note that melonJS implements a simple Axis-Aligned Boxes collision algorithm, which requires all polygons used for collision to be convex with all vertices defined with clockwise winding.\n * A polygon is convex when all line segments connecting two points in the interior do not cross any edge of the polygon\n * (which means that all angles are less than 180 degrees), as described here below : <br>\n * <center><img src=\"images/convex_polygon.png\"/></center><br>\n * A polygon's `winding` is clockwise if its vertices (points) are declared turning to the right. The image above shows COUNTERCLOCKWISE winding.\n */\nexport class Polygon {\n\t/**\n\t * origin point of the Polygon\n\t */\n\tpos: Vector2d;\n\n\t/**\n\t * Array of points defining the Polygon <br>\n\t * Note: If you manually change `points`, you **must** call `recalc`afterwards so that the changes get applied correctly.\n\t */\n\tpoints: Vector2d[];\n\n\t/**\n\t * The edges here are the direction of the `n`th edge of the polygon, relative to\n\t * the `n`th point. If you want to draw a given edge from the edge value, you must\n\t * first translate to the position of the starting point.\n\t */\n\tedges: Vector2d[];\n\n\t/**\n\t * a list of indices for all vertices composing this polygon\n\t */\n\tindices: number[];\n\n\t/**\n\t * The normals here are the direction of the normal for the `n`th edge of the polygon, relative\n\t * to the position of the `n`th point. If you want to draw an edge normal, you must first\n\t * translate to the position of the starting point.\n\t * @ignore\n\t */\n\tnormals: Vector2d[];\n\n\t/**\n\t * The bounding rectangle for this shape\n\t * @ignore\n\t */\n\tprivate _bounds: Bounds;\n\n\t/**\n\t * the shape type (used internally)\n\t */\n\ttype = \"Polygon\";\n\n\t/**\n\t * @param [x=0] - origin point of the Polygon\n\t * @param [y=0] - origin point of the Polygon\n\t * @param vertices - array of vector defining the Polygon\n\t */\n\tconstructor(x = 0, y = 0, vertices: PolygonVertices | LineVertices) {\n\t\tthis.pos = vector2dPool.get(x, y);\n\t\tthis.points = [];\n\t\tthis.edges = [];\n\t\tthis.indices = [];\n\t\tthis.normals = [];\n\t\tthis._bounds = boundsPool.get();\n\t\tthis.setVertices(vertices);\n\t}\n\n\t/**\n\t * set new value to the Polygon\n\t * @param x - position of the Polygon\n\t * @param y - position of the Polygon\n\t * @param points - array of vector or vertice defining the Polygon\n\t * @returns this instance for objecf chaining\n\t */\n\tsetShape(x: number, y: number, points: PolygonVertices | LineVertices) {\n\t\tthis.pos.set(x, y);\n\t\tthis.setVertices(points);\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the vertices defining this Polygon\n\t * @param vertices - array of vector or vertice defining the Polygon\n\t * @returns this instance for objecf chaining\n\t */\n\tsetVertices(vertices: PolygonVertices | LineVertices) {\n\t\tif (!Array.isArray(vertices)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (vertices.length < 2) {\n\t\t\tthrow new Error(\"You must provide at least two vertices\");\n\t\t}\n\n\t\tif (typeof vertices[0] === \"number\") {\n\t\t\tthis.points = [];\n\t\t\tfor (let p = 0; p < vertices.length; p += 2) {\n\t\t\t\tthis.points.push(\n\t\t\t\t\tnew Vector2d(\n\t\t\t\t\t\t(vertices as number[])[p],\n\t\t\t\t\t\t(vertices as number[])[p + 1],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (vertices[0] instanceof Vector2d) {\n\t\t\tthis.points = vertices as Vector2d[];\n\t\t} else {\n\t\t\tthis.points = [];\n\t\t\tfor (const vertex of vertices as XYPoint[]) {\n\t\t\t\tthis.points.push(new Vector2d(vertex.x, vertex.y));\n\t\t\t}\n\t\t}\n\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t\treturn this;\n\t}\n\n\t/**\n\t * apply the given transformation matrix to this Polygon\n\t * @param m - the transformation matrix\n\t * @returns Reference to this object for method chaining\n\t */\n\ttransform(m: Matrix2d) {\n\t\tconst points = this.points;\n\t\tconst len = points.length;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tm.apply(points[i]);\n\t\t}\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t\treturn this;\n\t}\n\n\t/**\n\t * apply an isometric projection to this shape\n\t * @returns Reference to this object for method chaining\n\t */\n\ttoIso() {\n\t\treturn this.rotate(Math.PI / 4).scale(Math.SQRT2, Math.SQRT1_2);\n\t}\n\n\t/**\n\t * apply a 2d projection to this shapen\n\t * @returns Reference to this object for method chaining\n\t */\n\tto2d() {\n\t\treturn this.scale(Math.SQRT1_2, Math.SQRT2).rotate(-Math.PI / 4);\n\t}\n\n\t/**\n\t * Rotate this Polygon (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: Vector2d | XYPoint) {\n\t\tif (angle !== 0) {\n\t\t\tconst points = this.points;\n\t\t\tconst len = points.length;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tpoints[i].rotate(angle, v);\n\t\t\t}\n\t\t\tthis.recalc();\n\t\t\tthis.updateBounds();\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Scales the polygon by the given factors along the x and y axes.\n\t * @param x - The factor by which to scale the polygon along the x-axis.\n\t * @param [y=x] - The factor by which to scale the polygon along the y-axis. Defaults to the value of x.\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x) {\n\t\tconst points = this.points;\n\t\tconst len = points.length;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tpoints[i].scale(x, y);\n\t\t}\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Scales the polygon by the given vector.\n\t * @param v - A vector containing the scaling factors for the x and y axes.\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector2d) {\n\t\treturn this.scale(v.x, v.y);\n\t}\n\n\t/**\n\t * Computes the calculated collision polygon.\n\t * This **must** be called if the `points` array, `angle`, or `offset` is modified manually.\n\t * @returns Reference to this object for method chaining\n\t */\n\trecalc() {\n\t\tconst edges = this.edges;\n\t\tconst normals = this.normals;\n\t\tconst indices = this.indices;\n\n\t\t// Copy the original points array and apply the offset/angle\n\t\tconst points = this.points;\n\t\tconst len = points.length;\n\n\t\tif (len < 3) {\n\t\t\tthrow new Error(\"Requires at least 3 points\");\n\t\t}\n\n\t\t// Calculate the edges/normals\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tlet edge = edges[i];\n\t\t\tif (typeof edge === \"undefined\") {\n\t\t\t\tedge = edges[i] = vector2dPool.get();\n\t\t\t}\n\t\t\tedge.copy(points[(i + 1) % len]).sub(points[i]);\n\n\t\t\tlet normal = normals[i];\n\t\t\tif (typeof normal === \"undefined\") {\n\t\t\t\tnormal = normals[i] = vector2dPool.get();\n\t\t\t}\n\t\t\tnormal.copy(edge).perp().normalize();\n\t\t}\n\n\t\t// Release any existing Vector2d objects back to the pool\n\t\tfor (let i = len; i < edges.length; i++) {\n\t\t\tvector2dPool.release(edges[i]);\n\t\t\tvector2dPool.release(normals[i]);\n\t\t}\n\n\t\t// trunc array\n\t\tedges.length = len;\n\t\tnormals.length = len;\n\n\t\t// do not do anything here, indices will be computed by\n\t\t// getIndices if array is empty upon function call\n\t\tindices.length = 0;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * returns a list of indices for all triangles defined in this polygon\n\t * @returns an array of vertex indices for all triangles forming this polygon.\n\t */\n\tgetIndices() {\n\t\tif (this.indices.length === 0) {\n\t\t\tthis.indices = earcut(\n\t\t\t\tthis.points.flatMap((p) => {\n\t\t\t\t\treturn [p.x, p.y];\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn this.indices;\n\t}\n\n\t/**\n\t * Returns true if the vertices composing this polygon form a convex shape (vertices must be in clockwise order).\n\t * @returns true if the vertices are convex, false if not, null if not computable\n\t */\n\tisConvex() {\n\t\t// http://paulbourke.net/geometry/polygonmesh/\n\t\t// Copyright (c) Paul Bourke (use permitted)\n\n\t\tlet flag = 0;\n\t\tconst vertices = this.points;\n\t\tconst n = vertices.length;\n\n\t\tif (n < 3) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\tconst j = (i + 1) % n;\n\t\t\tconst k = (i + 2) % n;\n\t\t\tlet z = (vertices[j].x - vertices[i].x) * (vertices[k].y - vertices[j].y);\n\t\t\tz -= (vertices[j].y - vertices[i].y) * (vertices[k].x - vertices[j].x);\n\n\t\t\tif (z < 0) {\n\t\t\t\tflag |= 1;\n\t\t\t} else if (z > 0) {\n\t\t\t\tflag |= 2;\n\t\t\t}\n\n\t\t\tif (flag === 3) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (flag !== 0) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Translates the Polygon by the specified offset.\n\t * @param x - The x offset or a vector point to translate by.\n\t * @param [y] - The y offset. This parameter is required if the first parameter is a number.\n\t * @returns Reference to this object for method chaining\n\t * @example\n\t * polygon.translate(10, 10);\n\t * // or\n\t * polygon.translate(myVector2d);\n\t */\n\ttranslate(x: number, y: number): Polygon;\n\ttranslate(vector: Vector2d): Polygon;\n\ttranslate(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\tthis.pos.x += _x;\n\t\tthis.pos.y += _y;\n\t\tthis.getBounds().translate(_x, _y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Shifts the Polygon to the given position vector.\n\t * @param x - The x coordinate or a vector point to shift to.\n\t * @param [y] - The y coordinate. This parameter is required if the first parameter is a number.\n\t * @example\n\t * polygon.shift(10, 10);\n\t * // or\n\t * polygon.shift(myVector2d);\n\t */\n\tshift(x: number, y: number): void;\n\tshift(vector: Vector2d): void;\n\tshift(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x;\n\t\tlet _y;\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\t\tthis.pos.x = _x;\n\t\tthis.pos.y = _y;\n\t\tthis.updateBounds();\n\t}\n\n\t/**\n\t * Returns true if the polygon contains the given point. <br>\n\t * (Note: it is highly recommended to first do a hit test on the corresponding <br>\n\t * bounding rect, as the function can be highly consuming with complex shapes)\n\t * @param x - x coordinate or a vector point to check\n\t * @param [y] - y coordinate\n\t * @param args\n\t * @returns True if the polygon contain the point, otherwise false\n\t * @example\n\t * if (polygon.contains(10, 10)) {\n\t * // do something\n\t * }\n\t * // or\n\t * if (polygon.contains(myVector2d)) {\n\t * // do something\n\t * }\n\t */\n\tcontains(x: number, y: number): boolean;\n\tcontains(vector: Vector2d): boolean;\n\tcontains(xOrVector: Vector2d | number, y?: number) {\n\t\tconst [_x, _y]: [number, number] =\n\t\t\txOrVector instanceof Vector2d\n\t\t\t\t? [xOrVector.x, xOrVector.y]\n\t\t\t\t: [xOrVector, y!];\n\n\t\tlet intersects = false;\n\t\tconst posx = this.pos.x;\n\t\tconst posy = this.pos.y;\n\t\tconst points = this.points;\n\t\tconst len = points.length;\n\n\t\t//http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n\t\tfor (let i = 0, j = len - 1; i < len; j = i++) {\n\t\t\tconst iy = points[i].y + posy;\n\t\t\tconst ix = points[i].x + posx;\n\t\t\tconst jy = points[j].y + posy;\n\t\t\tconst jx = points[j].x + posx;\n\t\t\tif (\n\t\t\t\tiy > _y !== jy > _y &&\n\t\t\t\t_x < ((jx - ix) * (_y - iy)) / (jy - iy) + ix\n\t\t\t) {\n\t\t\t\tintersects = !intersects;\n\t\t\t}\n\t\t}\n\t\treturn intersects;\n\t}\n\n\t/**\n\t * returns the bounding box for this shape, the smallest Rectangle object completely containing this shape.\n\t * @returns this shape bounding box Rectangle object\n\t */\n\tgetBounds() {\n\t\treturn this._bounds;\n\t}\n\n\t/**\n\t * update the bounding box for this shape.\n\t * @returns this shape bounding box Rectangle object\n\t */\n\tupdateBounds() {\n\t\tconst bounds = this.getBounds();\n\n\t\tbounds.update(this.points);\n\t\tbounds.translate(this.pos);\n\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * clone this Polygon\n\t * @returns new Polygon\n\t */\n\tclone() {\n\t\treturn polygonPool.get(\n\t\t\tthis.pos.x,\n\t\t\tthis.pos.y,\n\t\t\tthis.points.map((point) => point.clone()) as [\n\t\t\t\tVector2d,\n\t\t\t\tVector2d,\n\t\t\t\tVector2d,\n\t\t\t\t...Vector2d[],\n\t\t\t],\n\t\t);\n\t}\n}\n\nexport const polygonPool = createPool<\n\tPolygon,\n\t[x: number, y: number, vertices: PolygonVertices]\n>((x, y, vertices) => {\n\tconst polygon = new Polygon(x, y, vertices);\n\treturn {\n\t\tinstance: polygon,\n\t\treset(x, y, points) {\n\t\t\tpolygon.pos.set(x, y);\n\t\t\tpolygon.setVertices(points);\n\t\t},\n\t};\n});\n", "import { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { Polygon, PolygonVertices, polygonPool } from \"./polygon.ts\";\n\n/**\n * A rectangle object.\n */\nexport class Rect extends Polygon {\n\t/**\n\t * The shape type (used internally).\n\t */\n\toverride type = \"Rectangle\";\n\n\t/**\n\t * Creates a new rectangle.\n\t * @param x - The x position of the rectangle.\n\t * @param y - The y position of the rectangle.\n\t * @param w - The width of the rectangle.\n\t * @param h - The height of the rectangle.\n\t */\n\tconstructor(x: number, y: number, w: number, h: number) {\n\t\tsuper(x, y, [\n\t\t\tvector2dPool.get(0, 0), // 0, 0\n\t\t\tvector2dPool.get(w, 0), // 1, 0\n\t\t\tvector2dPool.get(w, h), // 1, 1\n\t\t\tvector2dPool.get(0, h), // 0, 1\n\t\t]);\n\t}\n\n\t/**\n\t * Set new dimensions for the rectangle.\n\t * @param width - The new width of the rectangle.\n\t * @param height - The new height of the rectangle.\n\t */\n\tsetSize(width: number, height: number) {\n\t\tthis.points[0].set(0, 0); // 0, 0\n\t\tthis.points[1].set(width, 0); // 1, 0\n\t\tthis.points[2].set(width, height); // 1, 1\n\t\tthis.points[3].set(0, height); // 0, 1\n\t\treturn this;\n\t}\n\n\t/**\n\t * The left coordinate of the Rectangle.\n\t */\n\tget left() {\n\t\treturn this.pos.x;\n\t}\n\n\t/**\n\t * right coordinate of the Rectangle\n\t */\n\tget right() {\n\t\tconst w = this.width;\n\t\treturn this.left + w || w;\n\t}\n\n\t/**\n\t * top coordinate of the Rectangle\n\t */\n\tget top() {\n\t\treturn this.pos.y;\n\t}\n\n\t/**\n\t * bottom coordinate of the Rectangle\n\t */\n\tget bottom() {\n\t\tconst h = this.height;\n\t\treturn this.top + h || h;\n\t}\n\n\t/**\n\t * width of the Rectangle\n\t */\n\tget width() {\n\t\treturn this.points[2].x;\n\t}\n\tset width(value) {\n\t\tthis.points[1].x = this.points[2].x = value;\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t}\n\n\t/**\n\t * height of the Rectangle\n\t */\n\tget height() {\n\t\treturn this.points[2].y;\n\t}\n\tset height(value) {\n\t\tthis.points[2].y = this.points[3].y = value;\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t}\n\n\t/**\n\t * absolute center of this rectangle on the horizontal axis\n\t */\n\tget centerX() {\n\t\tif (isFinite(this.width)) {\n\t\t\treturn this.left + this.width / 2;\n\t\t} else {\n\t\t\treturn this.width;\n\t\t}\n\t}\n\tset centerX(value) {\n\t\tthis.pos.x = value - this.width / 2;\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t}\n\n\t/**\n\t * absolute center of this rectangle on the vertical axis\n\t */\n\tget centerY() {\n\t\tif (isFinite(this.height)) {\n\t\t\treturn this.top + this.height / 2;\n\t\t} else {\n\t\t\treturn this.height;\n\t\t}\n\t}\n\tset centerY(value) {\n\t\tthis.pos.y = value - this.height / 2;\n\t\tthis.recalc();\n\t\tthis.updateBounds();\n\t}\n\n\t/**\n\t * center the rectangle position around the given coordinates\n\t * @param x - the x coordinate around which to center this rectangle\n\t * @param y - the y coordinate around which to center this rectangle\n\t * @returns this rectangle\n\t */\n\tcenterOn(x: number, y: number) {\n\t\tthis.centerX = x;\n\t\tthis.centerY = y;\n\t\treturn this;\n\t}\n\n\t/**\n\t * resize the rectangle\n\t * @param w - new width of the rectangle\n\t * @param h - new height of the rectangle\n\t * @returns this rectangle\n\t */\n\tresize(w: number, h: number) {\n\t\tthis.width = w;\n\t\tthis.height = h;\n\t\treturn this;\n\t}\n\n\t/**\n\t * scale the rectangle\n\t * @param x - a number representing the abscissa of the scaling vector.\n\t * @param [y=x] - a number representing the ordinate of the scaling vector.\n\t * @returns this rectangle\n\t */\n\toverride scale(x: number, y = x) {\n\t\tthis.width *= x;\n\t\tthis.height *= y;\n\t\treturn this;\n\t}\n\n\t/**\n\t * clone this rectangle\n\t * @returns new rectangle\n\t */\n\toverride clone() {\n\t\treturn new Rect(this.left, this.top, this.width, this.height);\n\t}\n\n\t/**\n\t * copy the position and size of the given rectangle into this one\n\t * @param rect - Source rectangle\n\t * @returns new rectangle\n\t */\n\tcopy(rect: Rect) {\n\t\tthis.pos.set(rect.pos.x, rect.pos.y);\n\t\tthis.setSize(rect.width, rect.height);\n\t\treturn this;\n\t}\n\n\t/**\n\t * merge this rectangle with another one\n\t * @param rect - other rectangle to union with\n\t * @returns the union(ed) rectangle\n\t */\n\tunion(rect: Rect) {\n\t\tconst x1 = Math.min(this.left, rect.left);\n\t\tconst y1 = Math.min(this.top, rect.top);\n\n\t\tthis.resize(\n\t\t\tMath.max(this.right, rect.right) - x1,\n\t\t\tMath.max(this.bottom, rect.bottom) - y1,\n\t\t);\n\n\t\tthis.pos.set(x1, y1);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * check if this rectangle is intersecting with the specified one\n\t * @param rect Other rectangle.\n\t * @returns true if overlaps\n\t */\n\toverlaps(rect: Rect) {\n\t\treturn (\n\t\t\tthis.left < rect.right &&\n\t\t\trect.left < this.right &&\n\t\t\tthis.top < rect.bottom &&\n\t\t\trect.top < this.bottom\n\t\t);\n\t}\n\n\toverride contains(x: number, y: number): boolean;\n\toverride contains(vector: Vector2d): boolean;\n\toverride contains(xOrVector: Vector2d | number, y?: number): boolean {\n\t\tlet _x1: number;\n\t\tlet _x2: number;\n\t\tlet _y1: number;\n\t\tlet _y2: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x1 = _x2 = xOrVector.x;\n\t\t\t_y1 = _y2 = xOrVector.y;\n\t\t} else {\n\t\t\t_x1 = _x2 = xOrVector;\n\t\t\t_y1 = _y2 = y!;\n\t\t}\n\t\treturn (\n\t\t\t_x1 >= this.left &&\n\t\t\t_x2 <= this.right &&\n\t\t\t_y1 >= this.top &&\n\t\t\t_y2 <= this.bottom\n\t\t);\n\t}\n\n\t/**\n\t * Returns true if the rectangle contains the given rectangle\n\t * @param rectangle - rectangle to test\n\t * @returns True if the rectangle contain the given rectangle, otherwise false\n\t * @example\n\t * if (rect.containsRectangle(myRect)) {\n\t * // do something\n\t * }\n\t */\n\tcontainsRectangle(rectangle: Rect) {\n\t\treturn (\n\t\t\trectangle.left >= this.left &&\n\t\t\trectangle.right <= this.right &&\n\t\t\trectangle.top >= this.top &&\n\t\t\trectangle.bottom <= this.bottom\n\t\t);\n\t}\n\n\t/**\n\t * Check if this rectangle is identical to the specified one.\n\t * @param rect Other rectangle.\n\t * @returns true if equals\n\t */\n\tequals(rect: Rect) {\n\t\treturn (\n\t\t\trect.left === this.left &&\n\t\t\trect.right === this.right &&\n\t\t\trect.top === this.top &&\n\t\t\trect.bottom === this.bottom\n\t\t);\n\t}\n\n\t/**\n\t * Determines whether all coordinates of this rectangle are finite numbers.\n\t * @returns false if all coordinates are positive or negative Infinity or NaN; otherwise, true.\n\t */\n\tisFinite() {\n\t\treturn (\n\t\t\tisFinite(this.left) &&\n\t\t\tisFinite(this.top) &&\n\t\t\tisFinite(this.width) &&\n\t\t\tisFinite(this.height)\n\t\t);\n\t}\n\n\t/**\n\t * Returns a polygon whose edges are the same as this box.\n\t * @returns a new Polygon that represents this rectangle.\n\t */\n\ttoPolygon() {\n\t\treturn polygonPool.get(this.left, this.top, this.points as PolygonVertices);\n\t}\n}\n\nexport const rectPool = createPool<\n\tRect,\n\t[x: number, y: number, width: number, height: number]\n>((x, y, width, height) => {\n\tconst rectangle = new Rect(x, y, width, height);\n\treturn {\n\t\tinstance: rectangle,\n\t\treset(x, y, width, height) {\n\t\t\trectangle.pos.set(x, y);\n\t\t\trectangle.setSize(width, height);\n\t\t},\n\t};\n});\n", "import { prefixed } from \"./../utils/agent.ts\";\nimport { getParent } from \"./../video/video.js\";\nimport { DOMContentLoaded } from \"./dom.ts\";\nimport { BLUR, eventEmitter, FOCUS } from \"./event.ts\";\nimport * as device_platform from \"./platform.ts\";\nimport save from \"./save.ts\";\n\n/**\n * device type and capabilities\n * @namespace device\n */\n\nlet accelInitialized = false;\nlet deviceOrientationInitialized = false;\n// swipe utility fn & flag\nlet swipeEnabled = true;\n// a cache DOMRect object\nconst domRect = {\n\tleft: 0,\n\ttop: 0,\n\tx: 0,\n\ty: 0,\n\twidth: 0,\n\theight: 0,\n\tright: 0,\n\tbottom: 0,\n};\n\n// a list of supported videoCodecs;\nlet videoCodecs;\n\n// internal flag to avoid rechecking for support\nlet WebGLSupport = -1;\n\nfunction disableSwipeFn(e) {\n\te.preventDefault();\n\tif (typeof globalThis.scroll === \"function\") {\n\t\tglobalThis.scroll(0, 0);\n\t}\n\treturn false;\n}\n\nfunction hasLocalStorage() {\n\ttry {\n\t\treturn !!globalThis.localStorage;\n\t} catch {\n\t\t// the above generates an exception when cookies are blocked\n\t\treturn false;\n\t}\n}\n\nfunction hasOffscreenCanvas() {\n\ttry {\n\t\t// some browser (e.g. Safari) implements WebGL1 and WebGL2 contexts only\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=801176\n\t\treturn (\n\t\t\ttypeof globalThis.OffscreenCanvas !== \"undefined\" &&\n\t\t\tnew globalThis.OffscreenCanvas(0, 0).getContext(\"2d\") !== null\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * used by [un]watchAccelerometer()\n * @ignore\n */\nfunction onDeviceMotion(e) {\n\t// Accelerometer information\n\taccelerationX = e.accelerationIncludingGravity.x;\n\taccelerationY = e.accelerationIncludingGravity.y;\n\taccelerationZ = e.accelerationIncludingGravity.z;\n}\n\n/**\n * used by [un]watchDeviceOrientation()\n * @ignore\n */\nexport function onDeviceRotate(e) {\n\tgamma = e.gamma;\n\tbeta = e.beta;\n\talpha = e.alpha;\n}\n\n/**\n * the device platform type\n * @memberof device\n * @readonly\n * @type {device.platform}\n */\nexport const platform = device_platform;\n\n/**\n * True if the browser supports Touch Events\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const touchEvent = !!(\"ontouchstart\" in globalThis);\n\n/**\n * True if the browser supports Pointer Events\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const pointerEvent = !!globalThis.PointerEvent;\n\n/**\n * Touch capabilities (support either Touch or Pointer events)\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const touch =\n\ttouchEvent || (pointerEvent && globalThis.navigator.maxTouchPoints > 0);\n\n/**\n * the maximum number of simultaneous touch contact points are supported by the current device.\n * @memberof device\n * @type {number}\n * @readonly\n * @example\n * if (me.device.maxTouchPoints > 1) {\n * // device supports multi-touch\n * }\n */\nexport const maxTouchPoints = touch\n\t? pointerEvent\n\t\t? globalThis.navigator.maxTouchPoints || 1\n\t\t: 10\n\t: 1;\n\n/**\n * W3C standard wheel events\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const wheel =\n\ttypeof globalThis.document !== \"undefined\" &&\n\t\"onwheel\" in globalThis.document.createElement(\"div\");\n\n/**\n * Browser pointerlock api support\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const hasPointerLockSupport =\n\ttypeof globalThis.document !== \"undefined\" &&\n\ttypeof globalThis.document.pointerLockElement !== \"undefined\";\n\n/**\n * Browser device orientation\n * @memberof device\n * @readonly\n * @type {boolean}\n */\nexport const hasDeviceOrientation = !!globalThis.DeviceOrientationEvent;\n\n/**\n * Supports the ScreenOrientation API\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation/onchange\n * @type {boolean}\n * @readonly\n */\nexport const screenOrientation =\n\ttypeof screen !== \"undefined\" && typeof screen.orientation !== \"undefined\";\n\n/**\n * Browser accelerometer capabilities\n * @memberof device\n * @readonly\n * @type {boolean}\n */\nexport const hasAccelerometer = !!globalThis.DeviceMotionEvent;\n\n/**\n * Browser full screen support\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const hasFullscreenSupport =\n\ttypeof globalThis.document !== \"undefined\" &&\n\t(prefixed(\"fullscreenEnabled\", globalThis.document) ||\n\t\tglobalThis.document.mozFullScreenEnabled);\n\n/**\n * Device WebAudio Support\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const hasWebAudio = !!(\n\tglobalThis.AudioContext || globalThis.webkitAudioContext\n);\n\n/**\n * Device HTML5Audio Support\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const hasHTML5Audio = typeof globalThis.Audio !== \"undefined\";\n\n/**\n * Returns true if the browser/device has audio capabilities.\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const sound = hasWebAudio || hasHTML5Audio;\n\n/**\n * Device Video Support\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const hasVideo =\n\ttypeof globalThis.document !== \"undefined\" &&\n\t!!globalThis.document.createElement(\"video\").canPlayType;\n\n/**\n * Browser Local Storage capabilities <br>\n * (this flag will be set to false if cookies are blocked)\n * @memberof device\n * @readonly\n * @type {boolean}\n */\nexport const localStorage = hasLocalStorage();\n\n/**\n * equals to true if the device browser supports OffScreenCanvas.\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const offscreenCanvas = hasOffscreenCanvas();\n\n/**\n * Browser Base64 decoding capability\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const nativeBase64 = typeof globalThis.atob === \"function\";\n\n/**\n * a string representing the preferred language of the user, usually the language of the browser UI.\n * (will default to \"en\" if the information is not available)\n * @memberof device\n * @type {string}\n * @readonly\n * @see http://www.w3schools.com/tags/ref_language_codes.asp\n */\nexport const language =\n\ttypeof globalThis.navigator !== \"undefined\"\n\t\t? globalThis.navigator.language ||\n\t\t\tglobalThis.navigator.browserLanguage ||\n\t\t\tglobalThis.navigator.userLanguage ||\n\t\t\t\"en\"\n\t\t: \"en\";\n\n/**\n * Ratio of the resolution in physical pixels to the resolution in CSS pixels for the current display device.\n * @memberof device\n * @type {number}\n * @readonly\n */\nexport const devicePixelRatio = globalThis.devicePixelRatio || 1;\n\n/**\n * equals to true if a mobile device.\n * (Android | iPhone | iPad | iPod | BlackBerry | Windows Phone | Kindle)\n * @memberof device\n * @type {boolean}\n * @readonly\n */\nexport const isMobile = platform.isMobile;\n\n/**\n * contains the g-force acceleration along the x-axis.\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchAccelerometer\n */\nexport let accelerationX = 0;\n\n/**\n * contains the g-force acceleration along the y-axis.\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchAccelerometer\n */\nexport let accelerationY = 0;\n\n/**\n * contains the g-force acceleration along the z-axis.\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchAccelerometer\n */\nexport let accelerationZ = 0;\n\n/**\n * Device orientation Gamma property. Gives angle on tilting a portrait held phone left or right\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchDeviceOrientation\n */\nexport let gamma = 0;\n\n/**\n * Device orientation Beta property. Gives angle on tilting a portrait held phone forward or backward\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchDeviceOrientation\n */\nexport let beta = 0;\n\n/**\n * Device orientation Alpha property. Gives angle based on the rotation of the phone around its z axis.\n * The z-axis is perpendicular to the phone, facing out from the center of the screen.\n * @memberof device\n * @type {number}\n * @readonly\n * @see device.watchDeviceOrientation\n */\nexport let alpha = 0;\n\n/**\n * Specify whether to automatically bring the window to the front\n * @memberof device\n * @type {boolean}\n * @default true\n */\nexport let autoFocus = true;\n\n/**\n * specify a function to execute when the Device is fully loaded and ready\n * @memberof device\n * @param {Function} fn - the function to be executed\n * @example\n * // small game skeleton\n * let game = {\n * // called by the me.device.onReady function\n * onload = function () {\n * // init video\n * if (!me.video.init('screen', 640, 480, true)) {\n * alert(\"Sorry but your browser does not support html 5 canvas.\");\n * return;\n * }\n *\n * // initialize the \"audio\"\n * me.audio.init(\"mp3,ogg\");\n *\n * // set callback for ressources loaded event\n * me.loader.onload = this.loaded.bind(this);\n *\n * // set all ressources to be loaded\n * me.loader.preload(game.assets);\n *\n * // load everything & display a loading screen\n * me.state.change(me.state.LOADING);\n * };\n *\n * // callback when everything is loaded\n * loaded = function () {\n * // define stuff\n * // ....\n *\n * // change to the menu screen\n * me.state.change(me.state.PLAY);\n * }\n * }; // game\n *\n * // \"bootstrap\"\n * me.device.onReady(function () {\n * game.onload();\n * });\n */\nexport function onReady(fn) {\n\t// register on blur/focus and visibility event handlers\n\tif (typeof globalThis.addEventListener === \"function\") {\n\t\t// set pause/stop action on losing focus\n\t\tglobalThis.addEventListener(\n\t\t\t\"blur\",\n\t\t\t() => {\n\t\t\t\teventEmitter.emit(BLUR);\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t\t// set restart/resume action on gaining focus\n\t\tglobalThis.addEventListener(\n\t\t\t\"focus\",\n\t\t\t() => {\n\t\t\t\teventEmitter.emit(FOCUS);\n\t\t\t\t// force focus if autofocus is on\n\t\t\t\tif (autoFocus === true) {\n\t\t\t\t\tfocus();\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t}\n\tif (typeof globalThis.document !== \"undefined\") {\n\t\tif (typeof globalThis.document.addEventListener === \"function\") {\n\t\t\t// register on the visibilitychange event if supported\n\t\t\tglobalThis.document.addEventListener(\n\t\t\t\t\"visibilitychange\",\n\t\t\t\t() => {\n\t\t\t\t\tif (globalThis.document.visibilityState === \"visible\") {\n\t\t\t\t\t\teventEmitter.emit(FOCUS);\n\t\t\t\t\t\t// force focus if autofocus is on\n\t\t\t\t\t\tif (autoFocus === true) {\n\t\t\t\t\t\t\tfocus();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\teventEmitter.emit(BLUR);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t}\n\t// call the supplied function\n\tDOMContentLoaded(fn);\n}\n\n/**\n * enable/disable swipe on WebView.\n * @memberof device\n * @param {boolean} [enable=true] - enable or disable swipe.\n */\nexport function enableSwipe(enable) {\n\tconst moveEvent = pointerEvent\n\t\t? \"pointermove\"\n\t\t: touchEvent\n\t\t\t? \"touchmove\"\n\t\t\t: \"mousemove\";\n\tif (enable !== false) {\n\t\tif (swipeEnabled === false) {\n\t\t\tglobalThis.document.removeEventListener(moveEvent, disableSwipeFn);\n\t\t\tswipeEnabled = true;\n\t\t}\n\t} else if (swipeEnabled === true) {\n\t\tglobalThis.document.addEventListener(moveEvent, disableSwipeFn, {\n\t\t\tpassive: false,\n\t\t});\n\t\tswipeEnabled = false;\n\t}\n}\n\n/**\n * Returns true if the browser/device is in full screen mode.\n * @memberof device\n * @returns {boolean}\n */\nexport function isFullscreen() {\n\tif (hasFullscreenSupport) {\n\t\treturn !!(\n\t\t\tprefixed(\"fullscreenElement\", globalThis.document) ||\n\t\t\tglobalThis.document.mozFullScreenElement\n\t\t);\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Triggers a fullscreen request. Requires fullscreen support from the browser/device.\n * @memberof device\n * @param {Element} [element] - the element to be set in full-screen mode.\n * @example\n * // add a keyboard shortcut to toggle Fullscreen mode on/off\n * me.input.bindKey(me.input.KEY.F, \"toggleFullscreen\");\n * me.event.on(me.event.KEYDOWN, function (action, keyCode, edge) {\n * // toggle fullscreen on/off\n * if (action === \"toggleFullscreen\") {\n * me.device.requestFullscreen();\n * } else {\n * me.device.exitFullscreen();\n * }\n * });\n */\nexport function requestFullscreen(element) {\n\tif (hasFullscreenSupport && !isFullscreen()) {\n\t\telement = element || getParent();\n\t\telement.requestFullscreen =\n\t\t\tprefixed(\"requestFullscreen\", element) || element.mozRequestFullScreen;\n\t\telement.requestFullscreen();\n\t}\n}\n\n/**\n * Exit fullscreen mode. Requires fullscreen support from the browser/device.\n * @memberof device\n */\nexport const exitFullscreen = () => {\n\tif (hasFullscreenSupport && isFullscreen()) {\n\t\tdocument.exitFullscreen();\n\t}\n};\n\n/**\n * Return a string representing the orientation of the device screen.\n * It can be \"any\", \"natural\", \"landscape\", \"portrait\", \"portrait-primary\", \"portrait-secondary\", \"landscape-primary\", \"landscape-secondary\"\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Screen/orientation\n * @returns {string} the screen orientation\n */\nexport function getScreenOrientation() {\n\tconst PORTRAIT = \"portrait\";\n\tconst LANDSCAPE = \"landscape\";\n\n\tconst screen = globalThis.screen;\n\n\t// first try using \"standard\" values\n\tif (screenOrientation === true) {\n\t\tconst orientation = prefixed(\"orientation\", screen);\n\t\tif (\n\t\t\ttypeof orientation !== \"undefined\" &&\n\t\t\ttypeof orientation.type === \"string\"\n\t\t) {\n\t\t\t// Screen Orientation API specification\n\t\t\treturn orientation.type;\n\t\t} else if (typeof orientation === \"string\") {\n\t\t\t// moz/ms-orientation are strings\n\t\t\treturn orientation;\n\t\t}\n\t}\n\n\t// check using the deprecated API\n\tif (typeof globalThis.orientation === \"number\") {\n\t\treturn Math.abs(globalThis.orientation) === 90 ? LANDSCAPE : PORTRAIT;\n\t}\n\n\t// fallback to window size check\n\treturn globalThis.outerWidth > globalThis.outerHeight ? LANDSCAPE : PORTRAIT;\n}\n\n/**\n * locks the device screen into the specified orientation.<br>\n * This method only works for installed Web apps or for Web pages in full-screen mode.\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation\n * @param {string|string[]} orientation - The orientation into which to lock the screen.\n * @returns {boolean} true if the orientation was unsuccessfully locked\n */\nexport function lockOrientation(orientation) {\n\tconst screen = globalThis.screen;\n\tif (typeof screen !== \"undefined\") {\n\t\tconst _lockOrientation = prefixed(\"lockOrientation\", screen);\n\t\tif (typeof _lockOrientation !== \"undefined\") {\n\t\t\treturn _lockOrientation(orientation);\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * unlocks the device screen into the specified orientation.<br>\n * This method only works for installed Web apps or for Web pages in full-screen mode.\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation\n * @returns {boolean} true if the orientation was unsuccessfully unlocked\n */\nexport function unlockOrientation() {\n\tconst screen = globalThis.screen;\n\tif (typeof screen !== \"undefined\") {\n\t\tconst _unlockOrientation = prefixed(\"unlockOrientation\", screen);\n\t\tif (typeof _unlockOrientation !== \"undefined\") {\n\t\t\treturn _unlockOrientation();\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * return true if the device screen orientation is in Portrait mode\n * @memberof device\n * @returns {boolean}\n */\nexport function isPortrait() {\n\treturn getScreenOrientation().includes(\"portrait\");\n}\n\n/**\n * return true if the device screen orientation is in Portrait mode\n * @memberof device\n * @returns {boolean}\n */\nexport function isLandscape() {\n\treturn getScreenOrientation().includes(\"landscape\");\n}\n\n/**\n * return the device storage\n * @memberof device\n * @see save\n * @param {string} [type=\"local\"]\n * @returns {object} a reference to the device storage\n */\nexport function getStorage(type = \"local\") {\n\tswitch (type) {\n\t\tcase \"local\":\n\t\t\treturn save;\n\n\t\tdefault:\n\t\t\tthrow new Error(\"storage type \" + type + \" not supported\");\n\t}\n}\n\n/**\n * return the parent DOM element for the given parent name or HTMLElement object\n * @memberof device\n * @param {string|HTMLElement} element - the parent element name or a HTMLElement object\n * @returns {HTMLElement} the parent Element\n */\nexport function getParentElement(element) {\n\tlet target = getElement(element);\n\n\tif (target.parentNode !== null) {\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn target;\n}\n\n/**\n * return the DOM element for the given element name or HTMLElement object\n * @memberof device\n * @param {string|HTMLElement} element - the parent element name or a HTMLElement object\n * @returns {HTMLElement} the corresponding DOM Element or null if not existing\n */\nexport function getElement(element) {\n\tlet target = null;\n\n\tif (element !== \"undefined\") {\n\t\tif (typeof element === \"string\") {\n\t\t\ttarget = globalThis.document.getElementById(element);\n\t\t} else if (\n\t\t\ttypeof element === \"object\" &&\n\t\t\telement.nodeType === Node.ELEMENT_NODE\n\t\t) {\n\t\t\ttarget = element;\n\t\t}\n\t}\n\n\t// fallback, if invalid target or non HTMLElement object\n\tif (!target) {\n\t\t//default to document.body\n\t\ttarget = globalThis.document.body;\n\t}\n\n\treturn target;\n}\n\n/**\n * returns the size of the given HTMLElement and its position relative to the viewport\n * <br><img src=\"images/element-box-diagram.png\"/>\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect\n * @param {string|HTMLElement} element - an HTMLElement object\n * @returns {DOMRect} the size and position of the element relatively to the viewport\n */\nexport function getElementBounds(element) {\n\tif (\n\t\ttypeof element === \"object\" &&\n\t\telement !== globalThis.document.body &&\n\t\ttypeof element.getBoundingClientRect !== \"undefined\"\n\t) {\n\t\treturn element.getBoundingClientRect();\n\t} else {\n\t\tdomRect.width = domRect.right = globalThis.innerWidth;\n\t\tdomRect.height = domRect.bottom = globalThis.innerHeight;\n\t\treturn domRect;\n\t}\n}\n\n/**\n * returns the size of the given HTMLElement Parent and its position relative to the viewport\n * <br><img src=\"images/element-box-diagram.png\"/>\n * @memberof device\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect\n * @param {string|HTMLElement} element - an HTMLElement object\n * @returns {DOMRect} the size and position of the given element parent relative to the viewport\n */\nexport function getParentBounds(element) {\n\treturn getElementBounds(getParentElement(element));\n}\n\n/**\n * returns true if the device supports WebGL\n * @memberof device\n * @param {object} [options] - context creation options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=true] - If true, the renderer will switch to CANVAS mode if the performances of a WebGL context would be dramatically lower than that of a native application making equivalent OpenGL calls.\n * @returns {boolean} true if WebGL is supported\n */\nexport function isWebGLSupported(options) {\n\tif (WebGLSupport === -1) {\n\t\tlet _supported = false;\n\t\ttry {\n\t\t\tconst canvas = globalThis.document.createElement(\"canvas\");\n\t\t\tconst ctxOptions = {\n\t\t\t\tstencil: true,\n\t\t\t\tfailIfMajorPerformanceCaveat: options.failIfMajorPerformanceCaveat,\n\t\t\t};\n\t\t\t_supported = !!(\n\t\t\t\tglobalThis.WebGLRenderingContext &&\n\t\t\t\t(canvas.getContext(\"webgl\", ctxOptions) ||\n\t\t\t\t\tcanvas.getContext(\"experimental-webgl\", ctxOptions))\n\t\t\t);\n\t\t\tWebGLSupport = _supported ? 1 : 0;\n\t\t} catch {\n\t\t\tWebGLSupport = 0;\n\t\t}\n\t}\n\treturn WebGLSupport === 1;\n}\n\n/**\n * Makes a request to bring this device window to the front.\n * @memberof device\n * @example\n * if (clicked) {\n * me.device.focus();\n * }\n */\nexport function focus() {\n\tif (typeof globalThis.focus === \"function\") {\n\t\tglobalThis.focus();\n\t}\n}\n\n/**\n * Enable monitor of the device accelerator to detect the amount of physical force of acceleration the device is receiving.\n * (one some device a first user gesture will be required before calling this function)\n * @memberof device\n * @see device.accelerationX\n * @see device.accelerationY\n * @see device.accelerationZ\n * @link {http://www.mobilexweb.com/samples/ball.html}\n * @link {http://www.mobilexweb.com/blog/safari-ios-accelerometer-websockets-html5}\n * @returns {boolean} false if not supported or permission not granted by the user\n * @example\n * // try to enable device accelerometer event on user gesture\n * me.input.registerPointerEvent(\"pointerleave\", me.game.viewport, function() {\n * if (me.device.watchAccelerometer() === true) {\n * // Success\n * me.input.releasePointerEvent(\"pointerleave\", me.game.viewport);\n * } else {\n * // ... fail at enabling the device accelerometer event\n * }\n * });\n */\nexport function watchAccelerometer() {\n\tif (hasAccelerometer && !accelInitialized) {\n\t\tif (\n\t\t\tDeviceOrientationEvent &&\n\t\t\ttypeof DeviceOrientationEvent.requestPermission === \"function\"\n\t\t) {\n\t\t\tDeviceOrientationEvent.requestPermission()\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (response === \"granted\") {\n\t\t\t\t\t\t// add a listener for the devicemotion event\n\t\t\t\t\t\tglobalThis.addEventListener(\"devicemotion\", onDeviceMotion, false);\n\t\t\t\t\t\taccelInitialized = true;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(console.error);\n\t\t} else {\n\t\t\t// add a listener for the devicemotion event\n\t\t\tglobalThis.addEventListener(\"devicemotion\", onDeviceMotion, false);\n\t\t\taccelInitialized = true;\n\t\t}\n\t}\n\treturn accelInitialized;\n}\n\n/**\n * unwatch Accelerometor event\n * @memberof device\n */\nexport function unwatchAccelerometer() {\n\tif (accelInitialized) {\n\t\t// remove the listener for the devicemotion event\n\t\tglobalThis.removeEventListener(\"devicemotion\", onDeviceMotion, false);\n\t\taccelInitialized = false;\n\t}\n}\n\n/**\n * Enable monitor of the device orientation to detect the current orientation of the device as compared to the Earth coordinate frame.\n * (one some device a first user gesture will be required before calling this function)\n * @memberof device\n * @see device.alpha\n * @see device.beta\n * @see device.gamma\n * @returns {boolean} false if not supported or permission not granted by the user\n * @example\n * // try to enable device orientation event on user gesture\n * me.input.registerPointerEvent(\"pointerleave\", me.game.viewport, function() {\n * if (me.device.watchDeviceOrientation() === true) {\n * // Success\n * me.input.releasePointerEvent(\"pointerleave\", me.game.viewport);\n * } else {\n * // ... fail at enabling the device orientation event\n * }\n * });\n */\nexport function watchDeviceOrientation() {\n\tif (hasDeviceOrientation && !deviceOrientationInitialized) {\n\t\tif (typeof DeviceOrientationEvent.requestPermission === \"function\") {\n\t\t\tDeviceOrientationEvent.requestPermission()\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (response === \"granted\") {\n\t\t\t\t\t\tglobalThis.addEventListener(\n\t\t\t\t\t\t\t\"deviceorientation\",\n\t\t\t\t\t\t\tonDeviceRotate,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdeviceOrientationInitialized = true;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(console.error);\n\t\t} else {\n\t\t\tglobalThis.addEventListener(\"deviceorientation\", onDeviceRotate, false);\n\t\t\tdeviceOrientationInitialized = true;\n\t\t}\n\t}\n\treturn deviceOrientationInitialized;\n}\n\n/**\n * unwatch Device orientation event\n * @memberof device\n */\nexport function unwatchDeviceOrientation() {\n\tif (deviceOrientationInitialized) {\n\t\tglobalThis.removeEventListener(\"deviceorientation\", onDeviceRotate, false);\n\t\tdeviceOrientationInitialized = false;\n\t}\n}\n\n/**\n * the vibrate method pulses the vibration hardware on the device, <br>\n * If the device doesn't support vibration, this method has no effect. <br>\n * If a vibration pattern is already in progress when this method is called,\n * the previous pattern is halted and the new one begins instead.\n * @memberof device\n * @param {number|number[]} pattern - pattern of vibration and pause intervals\n * @example\n * // vibrate for 1000 ms\n * me.device.vibrate(1000);\n * // or alternatively\n * me.device.vibrate([1000]);\n * // vibrate for 50 ms, be still for 100 ms, and then vibrate for 150 ms:\n * me.device.vibrate([50, 100, 150]);\n * // cancel any existing vibrations\n * me.device.vibrate(0);\n */\nexport function vibrate(pattern) {\n\tif (\n\t\ttypeof globalThis.navigator !== \"undefined\" &&\n\t\ttypeof globalThis.navigator.vibrate === \"function\"\n\t) {\n\t\tglobalThis.navigator.vibrate(pattern);\n\t}\n}\n\n/**\n * detect if the given video format is supported\n * @memberof device\n * @param {\"h264\"|\"h265\"|\"ogg\"|\"mp4\"|\"m4v\"|\"webm\"|\"vp9\"|\"hls\"} codec - the video format to check for support\n * @returns {boolean} return true if the given video format is supported\n */\nexport function hasVideoFormat(codec) {\n\tlet result = false;\n\tif (hasVideo === true) {\n\t\tif (typeof videoCodecs === \"undefined\") {\n\t\t\t// check for support\n\t\t\tconst videoElement = globalThis.document.createElement(\"video\");\n\t\t\tvideoCodecs = {\n\t\t\t\th264: videoElement\n\t\t\t\t\t.canPlayType('video/mp4; codecs=\"avc1.42E01E\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\th265: videoElement\n\t\t\t\t\t.canPlayType('video/mp4; codecs=\"hev1\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\togg: videoElement\n\t\t\t\t\t.canPlayType('video/ogg; codecs=\"theora\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\tmp4: videoElement\n\t\t\t\t\t.canPlayType('video/mp4; codecs=\"avc1.42E01E\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\tm4v: videoElement.canPlayType(\"video/x-m4v\").replace(/^no$/, \"\"),\n\t\t\t\twebm: videoElement\n\t\t\t\t\t.canPlayType('video/webm; codecs=\"vp8, vorbis\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\tvp9: videoElement\n\t\t\t\t\t.canPlayType('video/webm; codecs=\"vp9\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t\thls: videoElement\n\t\t\t\t\t.canPlayType('application/x-mpegURL; codecs=\"avc1.42E01E\"')\n\t\t\t\t\t.replace(/^no$/, \"\"),\n\t\t\t};\n\t\t}\n\t\tresult = !!videoCodecs[codec];\n\t}\n\treturn result;\n}\n", "import { capitalize } from \"./string.js\";\n\n/**\n * Known agent vendors\n */\nconst vendors = [\"ms\", \"MS\", \"moz\", \"webkit\", \"o\"];\n\n/**\n * Get a vendor-prefixed property\n * @param name - Property name\n * @param [obj] - Object or element reference to access\n * @returns Value of property\n */\nexport function prefixed(name: string, obj?: Record<string, unknown>) {\n\tobj = obj || globalThis;\n\tif (name in obj) {\n\t\treturn obj[name];\n\t}\n\n\tconst uc_name = capitalize(name);\n\n\tlet result;\n\tvendors.some((vendor) => {\n\t\tconst name = vendor + uc_name;\n\t\treturn (result = name in obj ? obj[name] : undefined);\n\t});\n\treturn result;\n}\n\n/**\n * Set a vendor-prefixed property\n * @param name - Property name\n * @param value - Property value\n * @param [obj] - Object or element reference to access\n * @returns true if one of the vendor-prefixed property was found\n */\nexport function setPrefixed(\n\tname: string,\n\tvalue: unknown,\n\tobj?: Record<string, unknown>,\n) {\n\tobj = obj || globalThis;\n\tif (name in obj) {\n\t\tobj[name] = value;\n\t\treturn;\n\t}\n\n\tconst uc_name = capitalize(name);\n\n\tvendors.some((vendor) => {\n\t\tconst name = vendor + uc_name;\n\t\tif (name in obj) {\n\t\t\tobj[name] = value;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t});\n\n\treturn false;\n}\n", "/**\n * a collection of string utility functions\n */\n\n/**\n * converts the first character of the given string to uppercase\n * @param str - the string to be capitalized\n * @returns the capitalized string\n */\nexport function capitalize(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * returns true if the given string contains a numeric integer or float value\n * @param str - the string to be tested\n * @returns true if string contains only digits\n */\nexport function isNumeric(str: string) {\n\tif (typeof str === \"string\") {\n\t\tstr = str.trim();\n\t}\n\treturn !Number.isNaN(str) && /^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)$/.test(str);\n}\n\n/**\n * returns true if the given string contains a true or false\n * @param str - the string to be tested\n * @returns true if the string is either true or false\n */\nexport function isBoolean(str: string) {\n\tconst trimmed = str.trim();\n\treturn trimmed === \"true\" || trimmed === \"false\";\n}\n\n/**\n * convert a string to the corresponding hexadecimal value\n * @param str - the string to be converted\n * @returns the converted hexadecimal value\n */\nexport function toHex(str: string) {\n\tlet res = \"\";\n\tlet c = 0;\n\twhile (c < str.length) {\n\t\tres += str.charCodeAt(c++).toString(16);\n\t}\n\treturn res;\n}\n\n/**\n * returns true if the given string is a data url in the `data:[<mediatype>][;base64],<data>` format.\n * (this will not test the validity of the Data or Base64 encoding)\n * @param str - the string (url) to be tested\n * @returns true if the string is a data url\n */\nexport function isDataUrl(str: string) {\n\treturn /^data:(.+);base64,(.+)$/.test(str);\n}\n", "import { defaultApplicationSettings } from \"../application/defaultApplicationSettings.ts\";\nimport { game, initialized } from \"./../index.js\";\nimport * as device from \"./../system/device.js\";\nimport {\n\teventEmitter,\n\tVIDEO_INIT,\n\tWINDOW_ONORIENTATION_CHANGE,\n\tWINDOW_ONRESIZE,\n\tWINDOW_ONSCROLL,\n} from \"../system/event.ts\";\n\n/**\n * @namespace video\n */\n\n/**\n * Select the HTML5 Canvas renderer\n */\n/**\n * Select the WebGL renderer\n */\n/**\n * Auto-select the renderer (Attempt WebGL first, with fallback to Canvas)\n */\nexport { AUTO, CANVAS, WEBGL } from \"../const\";\n\n/**\n * A reference to the active Canvas or WebGL active renderer renderer\n * @memberof video\n * @type {CanvasRenderer|WebGLRenderer}\n */\nexport let renderer = null;\n\n/**\n * Initialize the \"video\" system (create a canvas based on the given arguments, and the related renderer). <br>\n * @memberof video\n * @param {number} width - The width of the canvas viewport\n * @param {number} height - The height of the canvas viewport\n * @param {ApplicationSettings} [options] - optional parameters for the renderer\n * @returns {boolean} false if initialization failed (canvas not supported)\n * @example\n * // init the video with a 640x480 canvas\n * me.video.init(640, 480, {\n * parent : \"screen\",\n * renderer : me.video.AUTO,\n * scale : \"auto\",\n * scaleMethod : \"fit\"\n * });\n */\nexport function init(width, height, options) {\n\t// ensure melonjs has been properly initialized\n\tif (!initialized) {\n\t\tthrow new Error(\"me.video.init() called before engine initialization.\");\n\t}\n\n\ttry {\n\t\t// initialize the default game Application with the given options\n\t\tgame.init(\n\t\t\twidth,\n\t\t\theight,\n\t\t\tObject.assign(defaultApplicationSettings, options || {}),\n\t\t);\n\t} catch (e) {\n\t\tconsole.log(e.message);\n\t\t// me.video.init() historically returns false if failing at creating/using a HTML5 canvas\n\t\treturn false;\n\t}\n\n\t// assign the default renderer\n\trenderer = game.renderer;\n\n\t//add a channel for the onresize/onorientationchange event\n\tglobalThis.addEventListener(\n\t\t\"resize\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(WINDOW_ONRESIZE, e);\n\t\t},\n\t\tfalse,\n\t);\n\n\t// Screen Orientation API\n\tglobalThis.addEventListener(\n\t\t\"orientationchange\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(WINDOW_ONORIENTATION_CHANGE, e);\n\t\t},\n\t\tfalse,\n\t);\n\n\t// pre-fixed implementation on mozzila\n\tglobalThis.addEventListener(\n\t\t\"onmozorientationchange\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(WINDOW_ONORIENTATION_CHANGE, e);\n\t\t},\n\t\tfalse,\n\t);\n\n\tif (device.screenOrientation === true) {\n\t\tglobalThis.screen.orientation.onchange = (e) => {\n\t\t\teventEmitter.emit(WINDOW_ONORIENTATION_CHANGE, e);\n\t\t};\n\t}\n\n\t// Automatically update relative canvas position on scroll\n\tglobalThis.addEventListener(\n\t\t\"scroll\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(WINDOW_ONSCROLL, e);\n\t\t},\n\t\tfalse,\n\t);\n\n\t// notify the video has been initialized\n\teventEmitter.emit(VIDEO_INIT, game.renderer);\n\n\treturn true;\n}\n\n/**\n * Create and return a new Canvas element\n * @memberof video\n * @param {number} width - width\n * @param {number} height - height\n * @param {boolean} [returnOffscreenCanvas=false] - will return an OffscreenCanvas if supported\n * @returns {HTMLCanvasElement|OffscreenCanvas} a new Canvas element of the given size\n */\nexport function createCanvas(width, height, returnOffscreenCanvas = false) {\n\tlet _canvas;\n\n\tif (width === 0 || height === 0) {\n\t\tthrow new Error(\n\t\t\t\"width or height was zero, Canvas could not be initialized !\",\n\t\t);\n\t}\n\n\tif (device.offscreenCanvas === true && returnOffscreenCanvas === true) {\n\t\t_canvas = new globalThis.OffscreenCanvas(0, 0);\n\t\t// stubbing style for compatibility,\n\t\t// as OffscreenCanvas is detached from the DOM\n\t\tif (typeof _canvas.style === \"undefined\") {\n\t\t\t_canvas.style = {};\n\t\t}\n\t} else {\n\t\t// \"else\" create a \"standard\" canvas\n\t\t_canvas = globalThis.document.createElement(\"canvas\");\n\t}\n\t_canvas.width = width;\n\t_canvas.height = height;\n\n\treturn _canvas;\n}\n\n/**\n * return a reference to the parent DOM element holding the main canvas\n * @memberof video\n * @returns {HTMLElement} the HTML parent element\n */\nexport function getParent() {\n\treturn game.getParentElement();\n}\n", "export const ScaleMethods = {\n\t/**\n\t * Manual; no scaling is performed\n\t * <img src=\"images/scale-fit.png\"/>\n\t */\n\tManual: \"manual\",\n\n\t/**\n\t * Letterboxed; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-fit.png\"/>\n\t */\n\tFit: \"fit\",\n\n\t/**\n\t * Canvas is resized to fit minimum design resolution; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-fill-min.png\"/>\n\t */\n\tFillMin: \"fill-min\",\n\n\t/**\n\t * Canvas is resized to fit maximum design resolution; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-fill-max.png\"/>\n\t */\n\tFillMax: \"fill-max\",\n\n\t/**\n\t * Canvas width & height is resized to fit; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-flex.png\"/>\n\t */\n\tFlex: \"flex\",\n\n\t/**\n\t * Canvas width is resized to fit; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-flex-width.png\"/>\n\t */\n\tFlexWidth: \"flex-width\",\n\n\t/**\n\t * Canvas height is resized to fit; content is scaled to design aspect ratio\n\t * <img src=\"images/scale-flex-height.png\"/>\n\t */\n\tFlexHeight: \"flex-height\",\n\n\t/**\n\t * Canvas is resized to fit; content is scaled to screen aspect ratio\n\t * <img src=\"images/scale-stretch.png\"/>\n\t */\n\tStretch: \"stretch\",\n} as const;\n\nexport type ScaleMethod = (typeof ScaleMethods)[keyof typeof ScaleMethods];\n", "import { AUTO } from \"../const\";\nimport { ScaleMethods } from \"./scaleMethods\";\nimport { ApplicationSettings } from \"./settings\";\n\nexport const defaultApplicationSettings = {\n\trenderer: AUTO,\n\tscale: 1.0,\n\tscaleMethod: ScaleMethods.Manual,\n\tpreferWebGL1: false,\n\tdepthTest: \"sorting\",\n\tpowerPreference: \"default\",\n\ttransparent: false,\n\tantiAlias: false,\n\tconsoleHeader: !(\"__vitest_browser__\" in window),\n\tblendMode: \"normal\",\n\tphysic: \"builtin\",\n\tfailIfMajorPerformanceCaveat: true,\n\tsubPixel: false,\n\tverbose: false,\n\tlegacy: false,\n} satisfies Partial<ApplicationSettings>;\n", "/**\n * an event system based on nodeJS EventEmitter interface\n */\n\nimport Pointer from \"../input/pointer.js\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport { Draggable } from \"../renderable/draggable.js\";\nimport Stage from \"../state/stage.js\";\nimport Renderer from \"../video/renderer.js\";\nimport { EventEmitter } from \"./eventEmitter.js\";\n\n/**\n * event when the DOM is Ready is booting\n * @see event.on\n */\nexport const DOM_READY = \"dom_ready\";\n\n/**\n * event when the system is booting\n * @see event.on\n */\nexport const BOOT = \"me.boot\";\n\n/**\n * event generated when the system update the engine and the renderer by one step\n * @see event.on\n */\nexport const TICK = \"me.tick\";\n\n/**\n * event generated when the main browser or window is losing focus\n * @see event.on\n */\nexport const BLUR = \"me.blur\";\n\n/**\n * event generated when the main browser or window is gaining back focus\n * @see event.on\n */\nexport const FOCUS = \"me.focus\";\n\n/**\n * event when the game is paused <br>\n * Data passed : none <br>\n * @see event.on\n */\nexport const STATE_PAUSE = \"me.state.onPause\";\n\n/**\n * event for when the game is resumed <br>\n * Data passed : {number} time in ms the game was paused\n * @see event.on\n */\nexport const STATE_RESUME = \"me.state.onResume\";\n\n/**\n * event when the game is stopped <br>\n * Data passed : none <br>\n * @see event.on\n */\nexport const STATE_STOP = \"me.state.onStop\";\n\n/**\n * event for when the game is restarted <br>\n * Data passed : {number} time in ms the game was stopped\n * @see event.on\n */\nexport const STATE_RESTART = \"me.state.onRestart\";\n\n/**\n * event for when the changing to a different stage\n * @see event.on\n */\nexport const STATE_CHANGE = \"me.state.onChange\";\n\n/**\n * event for when a stage is resetted\n * @see event.on\n */\nexport const STAGE_RESET = \"me.stage.onReset\";\n\n/**\n * event for when the video is initialized<br>\n * Data passed : {Renderer} the renderer instance created\n * @see video.init\n * @see event.on\n */\nexport const VIDEO_INIT = \"me.video.onInit\";\n\n/**\n * event for when the game manager is initialized <br>\n * Data passed : none <br>\n * @see event.on\n */\nexport const GAME_INIT = \"me.game.onInit\";\n\n/**\n * event for when the game manager is resetted <br>\n * Data passed : none <br>\n * @see event.on\n */\nexport const GAME_RESET = \"me.game.onReset\";\n\n/**\n * event for when the engine is about to start a new game loop\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const GAME_BEFORE_UPDATE = \"me.game.beforeUpdate\";\n\n/**\n * event for the end of the update loop\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const GAME_AFTER_UPDATE = \"me.game.afterUpdate\";\n\n/**\n * Event for when the game is updated (will be impacted by frame skip, frame interpolation and pause/resume state) <br>\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const GAME_UPDATE = \"me.game.onUpdate\";\n\n/**\n * Event for the end of the draw loop\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const GAME_BEFORE_DRAW = \"me.game.beforeDraw\";\n\n/**\n * Event for the start of the draw loop\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const GAME_AFTER_DRAW = \"me.game.afterDraw\";\n\n/**\n * Event for when the physic world is updated\n * Data passed : {number} time the current time stamp\n * @see event.on\n */\nexport const WORLD_STEP = \"me.world.step\";\n\n/**\n * Event for when a level is loaded <br>\n * Data passed : {string} Level Name\n * @see event.on\n */\nexport const LEVEL_LOADED = \"me.game.onLevelLoaded\";\n\n/**\n * Event for when everything has loaded <br>\n * Data passed : none <br>\n * @see event.on\n */\nexport const LOADER_COMPLETE = \"me.loader.onload\";\n\n/**\n * Event for displaying a load progress indicator <br>\n * Data passed : {number} [0 .. 1], {Resource} resource object<br>\n * @see event.on\n */\nexport const LOADER_PROGRESS = \"me.loader.onProgress\";\n\n/**\n * Event for when an error occur during preloading <br>\n * Data passed : {Resource} resource object<br>\n * @see event.on\n */\nexport const LOADER_ERROR = \"me.loader.onError\";\n\n/**\n * Event for pressing a binded key <br>\n * Data passed : {string} user-defined action, {number} keyCode,\n * {boolean} edge state <br>\n * Edge-state is for detecting \"locked\" key bindings. When a locked key\n * is pressed and held, the first event will have the third argument\n * set true. Subsequent events will continue firing with the third\n * argument set false.\n * @see event.on\n * @example\n * me.input.bindKey(me.input.KEY.X, \"jump\", true); // Edge-triggered\n * me.input.bindKey(me.input.KEY.Z, \"shoot\"); // Level-triggered\n * me.event.on(me.event.KEYDOWN, (action, keyCode, edge) => {\n * // Checking bound keys\n * if (action === \"jump\") {\n * if (edge) {\n * this.doJump();\n * }\n *\n * // Make character fall slower when holding the jump key\n * this.vel.y = this.body.gravity;\n * }\n * });\n */\nexport const KEYDOWN = \"me.input.keydown\";\n\n/**\n * Event for releasing a binded key <br>\n * Data passed : {string} user-defined action, {number} keyCode\n * @see event.on\n * @example\n * me.event.on(me.event.KEYUP, (action, keyCode) => {\n * // Checking unbound keys\n * if (keyCode == me.input.KEY.ESC) {\n * if (me.state.isPaused()) {\n * me.state.resume();\n * }\n * else {\n * me.state.pause();\n * }\n * }\n * });\n */\nexport const KEYUP = \"me.input.keyup\";\n\n/**\n * Event for when a gamepad is connected <br>\n * Data passed : {object} gamepad object\n * @see event.on\n */\nexport const GAMEPAD_CONNECTED = \"gamepad.connected\";\n\n/**\n * Event for when a gamepad is disconnected <br>\n * Data passed : {object} gamepad object\n * @see event.on\n */\nexport const GAMEPAD_DISCONNECTED = \"gamepad.disconnected\";\n\n/**\n * Event for when gamepad button/axis state is updated <br>\n * Data passed : {number} index <br>\n * Data passed : {string} type : \"axes\" or \"buttons\" <br>\n * Data passed : {number} button <br>\n * Data passed : {number} current.value <br>\n * Data passed : {boolean} current.pressed\n * @see event.on\n */\nexport const GAMEPAD_UPDATE = \"gamepad.update\";\n\n/**\n * Event for pointermove events on the screen area <br>\n * Data passed : {me.Pointer} a Pointer object\n * @see event.on\n */\nexport const POINTERMOVE = \"me.event.pointermove\";\n\n/**\n * Event for onPointerLockChange event <br>\n * Data passed : {boolean} pointer lock status (true/false)\n * @see event.on\n */\nexport const POINTERLOCKCHANGE = \"me.event.pointerlockChange\";\n\n/**\n * Event for dragstart events on a Draggable entity <br>\n * Data passed:\n * {object} the drag event <br>\n * {object} the Draggable entity\n * @see event.on\n */\nexport const DRAGSTART = \"me.game.dragstart\";\n\n/**\n * Event for dragend events on a Draggable entity <br>\n * Data passed:\n * {object} the drag event <br>\n * {object} the Draggable entity\n * @see event.on\n */\nexport const DRAGEND = \"me.game.dragend\";\n\n/**\n * Event for when the (browser) window is resized <br>\n * Data passed : {Event} Event object\n * @see event.on\n */\nexport const WINDOW_ONRESIZE = \"globalThis.onresize\";\n\n/**\n * Event for when the canvas is resized <br>\n * (this usually follows a WINDOW_ONRESIZE event).<br>\n * Data passed : {number} canvas width <br>\n * Data passed : {number} canvas height\n * @see event.on\n */\nexport const CANVAS_ONRESIZE = \"canvas.onresize\";\n\n/**\n * Event for when the viewport is resized <br>\n * (this usually follows a WINDOW_ONRESIZE event, when using the `flex` scaling mode is used and after the viewport was updated).<br>\n * Data passed : {number} viewport width <br>\n * Data passed : {number} viewport height <br>\n * Data passed : {Camera2d} a reference to the camera viewport being resized\n * @see event.on\n */\nexport const VIEWPORT_ONRESIZE = \"viewport.onresize\";\n\n/**\n * Event for when the device is rotated <br>\n * Data passed : {Event} Event object <br>\n * @see event.on\n */\nexport const WINDOW_ONORIENTATION_CHANGE = \"globalThis.orientationchange\";\n\n/**\n * Event for when the (browser) window is scrolled <br>\n * Data passed : {Event} Event object\n * @see event.on\n */\nexport const WINDOW_ONSCROLL = \"globalThis.onscroll\";\n\n/**\n * Event for when the viewport position is updated <br>\n * Data passed : {me.Vector2d} viewport position vector\n * @see event.on\n */\nexport const VIEWPORT_ONCHANGE = \"viewport.onchange\";\n\n/**\n * Event for when the current context is lost <br>\n * Data passed : {me.Renderer} the current renderer instance\n * @see event.on\n */\nexport const ONCONTEXT_LOST = \"renderer.contextlost\";\n\n/**\n * Event for when the current context is restored <br>\n * Data passed : {me.Renderer} the current renderer instance`\n * @see event.on\n */\nexport const ONCONTEXT_RESTORED = \"renderer.contextrestored\";\n\ninterface Events {\n\t[DOM_READY]: () => void;\n\t[BOOT]: () => void;\n\t[TICK]: (time: number) => void;\n\t[BLUR]: () => void;\n\t[BLUR]: () => void;\n\t[STATE_PAUSE]: () => void;\n\t[STATE_RESUME]: (time: number) => void;\n\t[STATE_STOP]: () => void;\n\t[STATE_RESTART]: (time: number) => void;\n\t[STATE_CHANGE]: () => void;\n\t[STAGE_RESET]: (stage: Stage) => void;\n\t[VIDEO_INIT]: (renderer: Renderer) => void;\n\t[GAME_INIT]: () => void;\n\t[GAME_RESET]: () => void;\n\t[GAME_BEFORE_UPDATE]: (time: number) => void;\n\t[GAME_AFTER_UPDATE]: (time: number) => void;\n\t[GAME_UPDATE]: (time: number) => void;\n\t[GAME_BEFORE_DRAW]: (time: DOMHighResTimeStamp) => void;\n\t[GAME_AFTER_DRAW]: (time: DOMHighResTimeStamp) => void;\n\t[WORLD_STEP]: (dt: number) => void;\n\t[LEVEL_LOADED]: (levelId: string) => void;\n\t[LOADER_COMPLETE]: () => void;\n\t[LOADER_PROGRESS]: (progress: number, resource: unknown) => void;\n\t[LOADER_ERROR]: (resource: unknown) => void;\n\t[KEYDOWN]: (\n\t\taction: string | undefined,\n\t\tkeyCode: number,\n\t\tedge: boolean,\n\t) => void;\n\t[KEYUP]: (action: string | undefined, keyCode: number) => void;\n\t[GAMEPAD_CONNECTED]: (gamepad: Gamepad) => void;\n\t[GAMEPAD_DISCONNECTED]: (gamepad: Gamepad) => void;\n\t[GAMEPAD_UPDATE]: (\n\t\tindex: string,\n\t\ttype: \"buttons\" | \"axes\",\n\t\tbutton: number,\n\t\tcurrent: { value: number; pressed: boolean },\n\t) => void;\n\t[POINTERMOVE]: (pointer: Pointer) => void;\n\t[POINTERLOCKCHANGE]: (locked: boolean) => void;\n\t[DRAGSTART]: (event: unknown, draggable: Draggable) => void;\n\t[DRAGEND]: (event: unknown, draggable: Draggable) => void;\n\t[WINDOW_ONRESIZE]: (event: Event) => void;\n\t[WINDOW_ONORIENTATION_CHANGE]: (event: Event) => void;\n\t[WINDOW_ONSCROLL]: (event: Event) => void;\n\t[CANVAS_ONRESIZE]: (width: number, height: number) => void;\n\t[VIEWPORT_ONRESIZE]: (width: number, height: number) => void;\n\t[VIEWPORT_ONCHANGE]: (position: Vector2d) => void;\n\t[ONCONTEXT_LOST]: (renderer: Renderer) => void;\n\t[ONCONTEXT_RESTORED]: (renderer: Renderer) => void;\n}\n\nexport const eventEmitter = new EventEmitter<Events>();\n\n/**\n * Add a listener for a given event.\n * @param eventName - The event name.\n * @param listener - The listener function.\n * @param [context] - The context to invoke the listener with.\n * @example\n * me.event.on(\"event-name\", myFunction, this);\n */\nexport function on<E extends keyof Events>(\n\teventName: E,\n\tlistener: Events[E],\n\tcontext?: any,\n) {\n\teventEmitter.addListener(\n\t\teventName,\n\t\tcontext ? (listener.bind(context) as Events[E]) : listener,\n\t);\n}\n\n/**\n * Add a one-time listener for a given event.\n * @param eventName - The event name.\n * @param listener - The listener function.\n * @param [context] - The context to invoke the listener with.\n * @example\n * me.event.once(\"event-name\", myFunction, this);\n */\nexport function once<E extends keyof Events>(\n\teventName: E,\n\tlistener: Events[E],\n\tcontext?: any,\n) {\n\teventEmitter.addListenerOnce(\n\t\teventName,\n\t\tcontext ? (listener.bind(context) as Events[E]) : listener,\n\t);\n}\n\n/**\n * remove the given listener for a given event.\n * @param eventName - The event name.\n * @param listener - The listener function.\n * @example\n * me.event.off(\"event-name\", myFunction);\n */\nexport function off<E extends keyof Events>(eventName: E, listener: Events[E]) {\n\teventEmitter.removeListener(eventName, listener);\n}\n", "interface EventsMap {\n\t[event: string]: any;\n}\n\ninterface DefaultEvents extends EventsMap {\n\t[event: string]: (...args: any) => void;\n}\n\nexport class EventEmitter<Events extends EventsMap = DefaultEvents> {\n\tprivate eventListeners: Partial<{ [E in keyof Events]: Events[E][] }>;\n\tprivate eventListenersOnce: Partial<{ [E in keyof Events]: Events[E][] }>;\n\n\tconstructor() {\n\t\tthis.eventListeners = {};\n\t\tthis.eventListenersOnce = {};\n\t}\n\n\taddListener<E extends keyof Events>(event: E, listener: Events[E]) {\n\t\tlet eventListenerList = this.eventListeners[event];\n\t\tif (!eventListenerList) {\n\t\t\teventListenerList = [];\n\t\t\tthis.eventListeners[event] = eventListenerList;\n\t\t}\n\t\teventListenerList.push(listener);\n\n\t\treturn () => {\n\t\t\tthis.removeListener(event, listener);\n\t\t};\n\t}\n\n\taddListenerOnce<E extends keyof Events>(event: E, listener: Events[E]) {\n\t\tlet eventListenerList = this.eventListenersOnce[event];\n\t\tif (!eventListenerList) {\n\t\t\teventListenerList = [];\n\t\t\tthis.eventListenersOnce[event] = eventListenerList;\n\t\t}\n\t\teventListenerList.push(listener);\n\t}\n\n\tremoveAllListeners(event?: keyof Events) {\n\t\tif (event) {\n\t\t\tdelete this.eventListeners[event];\n\t\t} else {\n\t\t\tthis.eventListeners = {};\n\t\t}\n\t}\n\n\tremoveListener<E extends keyof Events>(event: E, listener: Events[E]) {\n\t\tconst listeners = this.eventListeners[event];\n\t\tif (listeners?.includes(listener)) {\n\t\t\tlisteners.splice(listeners.indexOf(listener), 1);\n\t\t}\n\n\t\tconst listenersOnce = this.eventListenersOnce[event];\n\t\tif (listenersOnce?.includes(listener)) {\n\t\t\tlistenersOnce.splice(listenersOnce.indexOf(listener), 1);\n\t\t}\n\t}\n\n\temit<E extends keyof Events>(event: E, ...args: Parameters<Events[E]>) {\n\t\tconst listeners = this.eventListeners[event];\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...args);\n\t\t\t}\n\t\t}\n\n\t\tconst listenersOnce = this.eventListenersOnce[event];\n\t\tif (listenersOnce) {\n\t\t\tfor (const listener of listenersOnce) {\n\t\t\t\tlistener(...args);\n\t\t\t}\n\t\t\tthis.eventListenersOnce[event] = [];\n\t\t}\n\t}\n\n\thasListener<E extends keyof Events>(event: E, listener: Events[E]) {\n\t\treturn (\n\t\t\tArray.from(this.eventListeners[event]?.values() ?? []).includes(\n\t\t\t\tlistener,\n\t\t\t) ||\n\t\t\tArray.from(this.eventListenersOnce[event]?.values() ?? []).includes(\n\t\t\t\tlistener,\n\t\t\t)\n\t\t);\n\t}\n}\n", "/**\n * The device platform type\n * @namespace platform\n * @memberof device\n * ua the user agent string for the current device\n * iOS `true` if the device is an iOS platform\n * android `true` if the device is an Android platform\n * android2 `true` if the device is an Android 2.x platform\n * linux `true` if the device is a Linux platform\n * chromeOS `true` if the device is running on ChromeOS.\n * wp `true` if the device is a Windows Phone platform\n * BlackBerry`true` if the device is a BlackBerry platform\n * Kindle`true` if the device is a Kindle platform\n * ejecta `true` if running under Ejecta\n * isWeixin `true` if running under Wechat\n * nodeJS `true` if running under node.js\n * isMobile `true` if a mobile device\n * webApp `true` if running as a standalone web app\n */\n\nexport const ua =\n\ttypeof globalThis.navigator !== \"undefined\"\n\t\t? globalThis.navigator.userAgent\n\t\t: \"\";\nexport const iOS = /iPhone|iPad|iPod/i.test(ua);\nexport const android = /Android/i.test(ua);\nexport const android2 = /Android 2/i.test(ua);\nexport const linux = /Linux/i.test(ua);\nexport const chromeOS = /CrOS/.test(ua);\nexport const wp = /Windows Phone/i.test(ua);\nexport const BlackBerry = /BlackBerry/i.test(ua);\nexport const Kindle = /Kindle|Silk.*Mobile Safari/i.test(ua);\nexport const ejecta = \"ejecta\" in globalThis;\nexport const isWeixin = /MicroMessenger/i.test(ua);\nexport const nodeJS =\n\ttypeof globalThis.process !== \"undefined\" &&\n\ttypeof globalThis.process.release !== \"undefined\" &&\n\tglobalThis.process.release.name === \"node\";\nexport const isMobile =\n\t/Mobi/i.test(ua) || iOS || android || wp || BlackBerry || Kindle || false;\nexport const webApp =\n\t(typeof globalThis.navigator !== \"undefined\" &&\n\t\t\"standalone\" in globalThis.navigator &&\n\t\tglobalThis.navigator.standalone === true) ||\n\t(typeof globalThis.matchMedia !== \"undefined\" &&\n\t\tglobalThis.matchMedia(\"(display-mode: standalone)\").matches);\n", "import { DOM_READY, eventEmitter } from \"./event.ts\";\nimport { nodeJS } from \"./platform.ts\";\n\n// track if DOMContentLoaded was called already\nlet readyBound = false;\n\n// is the DOM ready ?\nlet isDOMReady = false;\n\n// check if the dom is ready\nfunction _domReady() {\n\t// Make sure that the DOM is not already loaded\n\tif (!isDOMReady) {\n\t\t// be sure document.body is there\n\t\tif (\n\t\t\ttypeof globalThis.document !== \"undefined\" &&\n\t\t\t!globalThis.document.body\n\t\t) {\n\t\t\treturn setTimeout(_domReady, 13);\n\t\t}\n\n\t\t// clean up loading event\n\t\tif (\n\t\t\ttypeof globalThis.document !== \"undefined\" &&\n\t\t\ttypeof globalThis.document.removeEventListener === \"function\"\n\t\t) {\n\t\t\tglobalThis.document.removeEventListener(\n\t\t\t\t\"DOMContentLoaded\",\n\t\t\t\t_domReady,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\n\t\tif (typeof globalThis.removeEventListener === \"function\") {\n\t\t\t// remove the event on globalThis.onload (always added in `onReady`)\n\t\t\tglobalThis.removeEventListener(\"load\", _domReady, false);\n\t\t}\n\n\t\t// execute all callbacks\n\t\teventEmitter.emit(DOM_READY);\n\n\t\t// Remember that the DOM is ready\n\t\tisDOMReady = true;\n\t}\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event\nexport const DOMContentLoaded = (fn: () => void) => {\n\t// If the DOM is already ready\n\tif (isDOMReady) {\n\t\t// Execute the function immediately\n\t\tfn();\n\t} else {\n\t\t// else add the function to the DOM_READY event\n\t\teventEmitter.addListenerOnce(DOM_READY, fn);\n\t\t// bind dom load event if not done yet\n\t\tif (!readyBound) {\n\t\t\t// directly call domReady if document is already \"ready\"\n\t\t\tif (\n\t\t\t\tnodeJS ||\n\t\t\t\t(typeof globalThis.document !== \"undefined\" &&\n\t\t\t\t\tglobalThis.document.readyState === \"complete\")\n\t\t\t) {\n\t\t\t\t// defer the fn call to ensure our script is fully loaded\n\t\t\t\tglobalThis.setTimeout(_domReady, 0);\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\ttypeof globalThis.document !== \"undefined\" &&\n\t\t\t\t\ttypeof globalThis.document.addEventListener === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t// Use the handy event callback\n\t\t\t\t\tglobalThis.document.addEventListener(\n\t\t\t\t\t\t\"DOMContentLoaded\",\n\t\t\t\t\t\t_domReady,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// A fallback to globalThis.onload, that will always work\n\t\t\t\tglobalThis.addEventListener(\"load\", _domReady, false);\n\t\t\t}\n\t\t\treadyBound = true;\n\t\t}\n\t}\n};\n", "import { compare } from \"./semver.js\";\nimport { toHex } from \"./string.js\";\n\nexport * as agent from \"./agent.js\";\nexport * as array from \"./array.js\";\nexport * as file from \"./file.js\";\nexport * as function from \"./function.js\";\nexport * as string from \"./string.js\";\n\n/**\n * a collection of utility functions\n * @namespace utils\n */\n\n// guid default value\nlet GUID_base = \"\";\nlet GUID_index = 0;\n\n/**\n * Compare two version strings\n * @param v1 - First version string to compare\n * @param v2 - second version string to compare\n * @returns Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if v2 is greater\n * @example\n * if (me.utils.checkVersion(\"7.0.0\") > 0) {\n * console.error(\n * \"melonJS is too old. Expected: 7.0.0, Got: 6.3.0\"\n * );\n * }\n */\nexport function checkVersion(v1: string, v2: string) {\n\t// Convert to proper \"x.y.z\" format if necessary\n\tif (/^\\d+$/.test(v1)) {\n\t\tv1 += \".0.0\";\n\t} else if (/^\\d+\\.\\d+$/.test(v1)) {\n\t\tv1 += \".0\";\n\t}\n\tif (/^\\d+$/.test(v2)) {\n\t\tv2 += \".0.0\";\n\t} else if (/^\\d+\\.\\d+$/.test(v2)) {\n\t\tv2 += \".0\";\n\t}\n\treturn compare(v1, v2);\n}\n\n/**\n * parse the fragment (hash) from a URL and returns them into\n * @param [url] - an optional params string or URL containing fragment (hash) params to be parsed\n * @returns an object representing the deserialized params string.\n * [hitbox=false] draw the hitbox in the debug panel (if enabled)\n * [velocity=false] draw the entities velocity in the debug panel (if enabled)\n * [quadtree=false] draw the quadtree in the debug panel (if enabled)\n * [webgl=false] force the renderer to WebGL\n * [debug=false] display the debug panel (if preloaded)\n * [debugToggleKey=\"s\"] show/hide the debug panel (if preloaded)\n * @example\n * // http://www.example.com/index.html#debug&hitbox=true&mytag=value\n * let UriFragment = me.utils.getUriFragment();\n * console.log(UriFragment[\"mytag\"]); //> \"value\"\n */\nexport function getUriFragment(url: string) {\n\tconst hash: Record<string, string | boolean> = {};\n\n\tif (typeof url === \"undefined\") {\n\t\tif (typeof globalThis.document !== \"undefined\") {\n\t\t\tconst location = globalThis.document.location;\n\n\t\t\tif (location && location.hash) {\n\t\t\t\turl = location.hash;\n\t\t\t} else {\n\t\t\t\t// No \"document.location\" exist for Wechat mini game platform.\n\t\t\t\treturn hash;\n\t\t\t}\n\t\t} else {\n\t\t\t// \"document\" undefined on node.js\n\t\t\treturn hash;\n\t\t}\n\t} else {\n\t\t// never cache if a url is passed as parameter\n\t\tconst index = url.indexOf(\"#\");\n\t\tif (index !== -1) {\n\t\t\turl = url.slice(index, url.length);\n\t\t} else {\n\t\t\treturn hash;\n\t\t}\n\t}\n\n\t// parse the url\n\turl\n\t\t.slice(1)\n\t\t.split(\"&\")\n\t\t.filter((value) => {\n\t\t\treturn value !== \"\";\n\t\t})\n\t\t.forEach((value) => {\n\t\t\tconst kv = value.split(\"=\");\n\t\t\tconst k = kv.shift()!;\n\t\t\tconst v = kv.join(\"=\");\n\t\t\thash[k] = v || true;\n\t\t});\n\n\treturn hash;\n}\n\n/**\n * reset the GUID Base Name\n * the idea here being to have a unique ID\n * per level / object\n * @ignore\n */\nexport function resetGUID(base: string, index = 0) {\n\t// also ensure it's only 8bit ASCII characters\n\tGUID_base = toHex(base.toUpperCase());\n\tGUID_index = index;\n}\n\n/**\n * create and return a very simple GUID\n * Game Unique ID\n * @ignore\n */\nexport function createGUID(index = 1) {\n\t// to cover the case of undefined id for groups\n\tGUID_index += index;\n\treturn `${GUID_base}-${index || GUID_index}`;\n}\n\nexport const isStringArray = (value: unknown): value is string[] => {\n\treturn (\n\t\tArray.isArray(value) &&\n\t\tvalue.every((element) => {\n\t\t\treturn typeof element === \"string\";\n\t\t})\n\t);\n};\n", "const MAX_LENGTH = 256;\n\nconst compareIdentifiers = (a: number, b: number) => {\n\tif (a === b) {\n\t\treturn 0;\n\t} else if (a < b) {\n\t\treturn -1;\n\t} else {\n\t\treturn 1;\n\t}\n};\n\nconst SEMVER_REGEX = /(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)/;\n\nclass SemVer {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n\n\tconstructor(version: string) {\n\t\tif (version.length > MAX_LENGTH) {\n\t\t\tthrow new TypeError(`version is longer than ${MAX_LENGTH} characters`);\n\t\t}\n\n\t\tconst m = version.trim().match(SEMVER_REGEX);\n\n\t\tif (!m) {\n\t\t\tthrow new TypeError(`Invalid Version: ${version}`);\n\t\t}\n\n\t\t// these are actually numbers\n\t\tthis.major = +m[1];\n\t\tthis.minor = +m[2];\n\t\tthis.patch = +m[3];\n\n\t\tif (this.major > Number.MAX_SAFE_INTEGER || this.major < 0) {\n\t\t\tthrow new TypeError(\"Invalid major version\");\n\t\t}\n\n\t\tif (this.minor > Number.MAX_SAFE_INTEGER || this.minor < 0) {\n\t\t\tthrow new TypeError(\"Invalid minor version\");\n\t\t}\n\n\t\tif (this.patch > Number.MAX_SAFE_INTEGER || this.patch < 0) {\n\t\t\tthrow new TypeError(\"Invalid patch version\");\n\t\t}\n\t}\n\n\tasString() {\n\t\treturn `${this.major}.${this.minor}.${this.patch}`;\n\t}\n\n\tcompare(other: SemVer) {\n\t\tif (other.asString() === this.asString()) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.compareMain(other);\n\t}\n\n\tcompareMain(other: SemVer) {\n\t\treturn (\n\t\t\tcompareIdentifiers(this.major, other.major) ||\n\t\t\tcompareIdentifiers(this.minor, other.minor) ||\n\t\t\tcompareIdentifiers(this.patch, other.patch)\n\t\t);\n\t}\n}\n\nexport const compare = (a: string, b: string) => {\n\treturn new SemVer(a).compare(new SemVer(b));\n};\n", "import {\n\trandom as mathRandom,\n\tweightedRandom as mathWeightedRandom,\n} from \"../math/math.js\";\n\n/**\n * a collection of array utility functions\n */\n\n/**\n * Remove the specified object from the given Array\n * @param arr - array from which to remove an object\n * @param obj - to be removed\n * @returns the modified Array\n * let arr = [ \"foo\", \"bar\", \"baz\" ];\n * // remove \"foo\" from the array\n * me.utils.array.remove(arr, \"foo\");\n */\nexport function remove<T>(arr: T[], obj: T): T[] {\n\tconst i = Array.prototype.indexOf.call(arr, obj);\n\tif (i !== -1) {\n\t\tArray.prototype.splice.call(arr, i, 1);\n\t}\n\treturn arr;\n}\n\n/**\n * return a random array element\n * @param arr - array to pick a element\n * @returns random member of array\n * @example\n * // Select a random array element\n * let arr = [ \"foo\", \"bar\", \"baz\" ];\n * console.log(me.utils.array.random(arr));\n */\nexport function random<T>(arr: T[]) {\n\treturn arr[mathRandom(0, arr.length)];\n}\n\n/**\n * return a weighted random array element, favoring the earlier entries\n * @param arr - array to pick a element\n * @returns random member of array\n */\nexport function weightedRandom<T>(arr: T[]) {\n\treturn arr[mathWeightedRandom(0, arr.length)];\n}\n", "/**\n * a collection of file utility functions\n */\n\n// regexp to deal with file name & path\nconst PATH = /^.*(\\\\|\\/|:)/;\nconst EXT = /\\.[^.]*$/;\n\n/**\n * return the base name of the file without path info\n * @param path - path containing the basename to extract\n * @returns the base name without path information.\n */\nexport function getBasename(path: string) {\n\treturn path.replace(PATH, \"\").replace(EXT, \"\");\n}\n\n/**\n * return the extension of the file in the given path\n * @param path - path containing the filename and extension to extract\n * @returns filename extension.\n */\nexport function getExtension(path: string) {\n\treturn path.substring(path.lastIndexOf(\".\") + 1, path.length);\n}\n", "/**\n * a collection of utility functions\n */\n\n/**\n * Executes a function as soon as the interpreter is idle (stack empty).\n * @param func - The function to be deferred.\n * @param thisArg - The value to be passed as the this parameter to the target function when the deferred function is called\n * @param args - Optional additional arguments to carry for the function.\n * @returns id that can be used to clear the deferred function using\n * clearTimeout\n * @example\n * // execute myFunc() when the stack is empty,\n * // with the current context and [1, 2, 3] as parameter\n * me.utils.function.defer(myFunc, this, 1, 2, 3);\n */\nexport function defer(\n\tfunc: () => unknown,\n\tthisArg: unknown,\n\t...args: unknown[]\n) {\n\treturn setTimeout(func.bind(thisArg), 0, ...args);\n}\n\n/**\n * returns a function that, when invoked will only be triggered at most once during a given window of time\n * @param fn - the function to be throttled.\n * @param [wait] - the delay in ms\n * @returns the function that will be throttled\n */\nexport const throttle = (fn: () => void, wait: number = 100) => {\n\tlet inThrottle: boolean,\n\t\tlastFn: ReturnType<typeof setTimeout>,\n\t\tlastTime: number;\n\treturn (...args: [] /* empty array */) => {\n\t\tif (!inThrottle) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastTime = Date.now();\n\t\t\tinThrottle = true;\n\t\t} else {\n\t\t\tclearTimeout(lastFn);\n\t\t\tlastFn = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastTime >= wait) {\n\t\t\t\t\t\tfn.apply(this, args);\n\t\t\t\t\t\tlastTime = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tMath.max(wait - (Date.now() - lastTime), 0),\n\t\t\t);\n\t\t}\n\t};\n};\n", "import { Jsonifiable } from \"type-fest\";\n/**\n * allow to access and manage the device localStorage\n * @example\n * // Initialize \"score\" and \"lives\" with default values\n * // This loads the properties from localStorage if they exist, else it sets the given defaults\n * me.save.add({ score : 0, lives : 3 });\n *\n * // Print all\n * // On first load, this prints { score : 0, lives : 3 }\n * // On further reloads, it prints { score : 31337, lives : 3, complexObject : ... }\n * // Because the following changes will be saved to localStorage\n * console.log(JSON.stringify(me.save));\n *\n * // Save score\n * me.save.score = 31337;\n *\n * // Also supports complex objects thanks to the JSON backend\n * me.save.add({ complexObject : {} })\n * me.save.complexObject = { a : \"b\", c : [ 1, 2, 3, \"d\" ], e : { f : [{}] } };\n *\n * // WARNING: Do not set any child properties of complex objects directly!\n * // Changes made that way will not save. Always set the entire object value at once.\n * // If you cannot live with this limitation, there's a workaround:\n * me.save.complexObject.c.push(\"foo\"); // Modify a child property\n * me.save.complexObject = me.save.complexObject; // Save the entire object!\n *\n * // Remove \"lives\" from localStorage\n * me.save.remove(\"lives\");\n * @namespace save\n */\n\nimport { isStringArray } from \"../utils/utils.js\";\nimport { BOOT, eventEmitter } from \"./event.js\";\n\n// Variable to hold the object data\nconst data: Record<string, unknown> = {};\n\nlet hasLocalStorage = false;\n\ntry {\n\t// true if localStorage is supported\n\thasLocalStorage =\n\t\ttypeof globalThis !== \"undefined\" &&\n\t\ttypeof globalThis.localStorage !== \"undefined\";\n} catch {\n\t// the above generates an exception when cookies are blocked\n\thasLocalStorage = false;\n}\n\n/**\n * a function to check if the given key is a reserved word\n * @ignore\n */\nfunction isReserved(key: string) {\n\treturn key === \"add\" || key === \"remove\";\n}\n\n// Initialize me.save on Boot event\neventEmitter.addListenerOnce(BOOT, () => {\n\t// Load previous data if local Storage is supported\n\tif (hasLocalStorage) {\n\t\tconst me_save_content = localStorage.getItem(\"me.save\");\n\n\t\tif (me_save_content !== null && me_save_content.length > 0) {\n\t\t\ttry {\n\t\t\t\tconst stored: unknown = JSON.parse(me_save_content);\n\t\t\t\tconst keys = isStringArray(stored) ? stored : [];\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst storageKey = `me.save.${key}`;\n\t\t\t\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\t\t\t\tdata[key] = stored === null ? null : JSON.parse(stored);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// do nothing is invalid json\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// do nothing is invalid json\n\t\t\t}\n\t\t}\n\t}\n});\n\nconst save: Record<string, unknown> = {\n\t/**\n\t * Add new keys to localStorage and set them to the given default values if they do not exist\n\t * @param props - key and corresponding values\n\t * @example\n\t * // Initialize \"score\" and \"lives\" with default values\n\t * me.save.add({ score : 0, lives : 3 });\n\t * // get or set the value through me.save\n\t * me.save.score = 1000;\n\t */\n\tadd(props: Record<string, Jsonifiable>) {\n\t\tconst obj = save;\n\n\t\tfor (const key of Object.keys(props)) {\n\t\t\tif (isReserved(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tObject.defineProperty(obj, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tget() {\n\t\t\t\t\treturn data[key];\n\t\t\t\t},\n\t\t\t\tset(value) {\n\t\t\t\t\tdata[key] = value;\n\t\t\t\t\tif (hasLocalStorage) {\n\t\t\t\t\t\tlocalStorage.setItem(`me.save.${key}`, JSON.stringify(value));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!(key in data)) {\n\t\t\t\tsave[key] = props[key];\n\t\t\t}\n\t\t}\n\n\t\t// Save keys\n\t\tif (hasLocalStorage) {\n\t\t\tlocalStorage.setItem(\"me.save\", JSON.stringify(Object.keys(data)));\n\t\t}\n\t},\n\n\t/**\n\t * Remove a key from localStorage\n\t * @param key - key to be removed\n\t * @example\n\t * // Remove the \"score\" key from localStorage\n\t * me.save.remove(\"score\");\n\t */\n\tremove(key: string) {\n\t\tif (!isReserved(key)) {\n\t\t\tif (typeof data[key] !== \"undefined\") {\n\t\t\t\tdelete data[key];\n\t\t\t\tif (hasLocalStorage) {\n\t\t\t\t\tglobalThis.localStorage.removeItem(`me.save.${key}`);\n\t\t\t\t\tglobalThis.localStorage.setItem(\n\t\t\t\t\t\t\"me.save\",\n\t\t\t\t\t\tJSON.stringify(Object.keys(data)),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport default save;\n", "// external import\nimport { Howl, Howler } from \"howler\";\nimport { clamp } from \"./../math/math.ts\";\nimport { isDataUrl } from \"./../utils/string.ts\";\n\n/**\n * additional import for TypeScript\n * @import { Asset } from \"./../loader/loader.js\";\n */\n\n/**\n * audio channel list\n * @ignore\n */\nconst audioTracks = {};\n\n/**\n * current active track\n * @ignore\n */\nlet current_track_id = null;\n\n/**\n * error retry counter\n * @ignore\n */\nlet retry_counter = 0;\n\n/**\n * list of active audio formats\n * @ignore\n */\nlet audioExts = [];\n\n/**\n * event listener callback on load error\n * @ignore\n */\nconst soundLoadError = function (sound_name, onerror_cb) {\n\t// check the retry counter\n\tif (retry_counter++ > 3) {\n\t\t// something went wrong\n\t\tconst errmsg = \"melonJS: failed loading \" + sound_name;\n\t\tif (stopOnAudioError === false) {\n\t\t\t// disable audio\n\t\t\tdisable();\n\t\t\t// call error callback if defined\n\t\t\tonerror_cb?.();\n\t\t\t// warning\n\t\t\tconsole.log(errmsg + \", disabling audio\");\n\t\t} else {\n\t\t\tonerror_cb?.();\n\t\t\t// throw an exception and stop everything !\n\t\t\tthrow new Error(errmsg);\n\t\t}\n\t\t// else try loading again !\n\t} else {\n\t\taudioTracks[sound_name].load();\n\t}\n};\n\n/**\n * Specify either to stop on audio loading error or not<br>\n * if true, melonJS will throw an exception and stop loading<br>\n * if false, melonJS will disable sounds and output a warning message\n * in the console<br>\n * @default true\n */\nexport let stopOnAudioError = true;\n\n/**\n * Initialize and configure the audio support.<br>\n * For a maximum browser coverage the recommendation is to use at least two of them,\n * typically default to webm and then fallback to mp3 for the best balance of small filesize and high quality,\n * webm has nearly full browser coverage with a great combination of compression and quality, and mp3 will fallback gracefully for other browsers.\n * It is important to remember that melonJS selects the first compatible sound based on the list of extensions and given order passed here.\n * So if you want webm to be used before mp3, you need to put the audio format in that order.\n * @param {string} [format=\"mp3\"] - audio format to prioritize (\"mp3\"|\"mpeg\"|\"opus\"|\"ogg\"|\"oga\"|\"wav\"|\"aac\"|\"caf\"|\"m4a\"|\"m4b\"|\"mp4\"|\"weba\"|\"webm\"|\"dolby\"|\"flac\")\n * @returns {boolean} Indicates whether audio initialization was successful\n * @example\n * // initialize the \"sound engine\", giving \"webm\" as default desired audio format, and \"mp3\" as a fallback\n * if (!me.audio.init(\"webm,mp3\")) {\n * alert(\"Sorry but your browser does not support html 5 audio !\");\n * return;\n * }\n */\nexport function init(format = \"mp3\") {\n\t// convert it into an array\n\taudioExts = format.split(\",\");\n\n\treturn !Howler.noAudio;\n}\n\n/**\n * check if the given audio format is supported\n * @param {\"mp3\"|\"mpeg\"|\"opus\"|\"ogg\"|\"oga\"|\"wav\"|\"aac\"|\"caf\"|\"m4a\"|\"m4b\"|\"mp4\"|\"weba\"|\"webm\"|\"dolby\"|\"flac\"} codec - the audio format to check for support\n * @returns {boolean} return true if the given audio format is supported\n */\nexport function hasFormat(codec) {\n\treturn hasAudio() && Howler.codecs(codec);\n}\n\n/**\n * check if audio (HTML5 or WebAudio) is supported\n * @returns {boolean} return true if audio (HTML5 or WebAudio) is supported\n */\nexport function hasAudio() {\n\treturn !Howler.noAudio;\n}\n\n/**\n * enable audio output <br>\n * only useful if audio supported and previously disabled through\n * @see {@link disable}\n */\nexport function enable() {\n\tunmuteAll();\n}\n\n/**\n * disable audio output\n */\nexport function disable() {\n\tmuteAll();\n}\n\n/**\n * Load an audio file\n * @param {Asset} sound\n * @param {Function} [onloadcb] - function to be called when the resource is loaded\n * @param {Function} [onerrorcb] - function to be called in case of error\n * @param {Object} [settings] - custom settings to apply to the request (@link https://developer.mozilla.org/en-US/docs/Web/API/fetch#options)\n * @returns {number} the amount of asset loaded (always 1 if successfull)\n */\nexport function load(sound, onloadcb, onerrorcb, settings = {}) {\n\tconst urls = [];\n\tif (audioExts.length === 0) {\n\t\tthrow new Error(\n\t\t\t\"target audio extension(s) should be set through me.audio.init() before calling the preloader.\",\n\t\t);\n\t}\n\tif (isDataUrl(sound.src) === true) {\n\t\turls.push(sound.src);\n\t} else {\n\t\tfor (let i = 0; i < audioExts.length; i++) {\n\t\t\turls.push(sound.src + sound.name + \".\" + audioExts[i] + settings.nocache);\n\t\t}\n\t}\n\n\taudioTracks[sound.name] = new Howl({\n\t\tsrc: urls,\n\t\tvolume: Howler.volume(),\n\t\tautoplay: sound.autoplay === true,\n\t\tloop: (sound.loop = true),\n\t\thtml5: sound.stream === true || sound.html5 === true,\n\t\txhrWithCredentials: settings.withCredentials,\n\t\tonloaderror() {\n\t\t\tsoundLoadError.call(this, sound.name, onerrorcb);\n\t\t},\n\t\tonload() {\n\t\t\tretry_counter = 0;\n\t\t\tif (typeof onloadcb === \"function\") {\n\t\t\t\tonloadcb();\n\t\t\t}\n\t\t},\n\t});\n\n\treturn 1;\n}\n\n/**\n * play the specified sound\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {boolean} [loop=false] - loop audio\n * @param {Function} [onend] - Function to call when sound instance ends playing.\n * @param {number} [volume=default] - Float specifying volume (0.0 - 1.0 values accepted).\n * @returns {number} the sound instance ID.\n * @example\n * // play the \"cling\" audio clip\n * me.audio.play(\"cling\");\n * // play & repeat the \"engine\" audio clip\n * me.audio.play(\"engine\", true);\n * // play the \"gameover_sfx\" audio clip and call myFunc when finished\n * me.audio.play(\"gameover_sfx\", false, myFunc);\n * // play the \"gameover_sfx\" audio clip with a lower volume level\n * me.audio.play(\"gameover_sfx\", false, null, 0.5);\n */\nexport function play(sound_name, loop = false, onend, volume) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\tconst id = sound.play();\n\t\tif (typeof loop === \"boolean\") {\n\t\t\t// arg[0] can take different types in howler 2.0\n\t\t\tsound.loop(loop, id);\n\t\t}\n\t\tsound.volume(\n\t\t\ttypeof volume === \"number\" ? clamp(volume, 0.0, 1.0) : Howler.volume(),\n\t\t\tid,\n\t\t);\n\t\tif (typeof onend === \"function\") {\n\t\t\tif (loop === true) {\n\t\t\t\tsound.on(\"end\", onend, id);\n\t\t\t} else {\n\t\t\t\tsound.once(\"end\", onend, id);\n\t\t\t}\n\t\t}\n\t\treturn id;\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * Fade a currently playing sound between two volumee.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} from - Volume to fade from (0.0 to 1.0).\n * @param {number} to - Volume to fade to (0.0 to 1.0).\n * @param {number} duration - Time in milliseconds to fade.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will fade.\n */\nexport function fade(sound_name, from, to, duration, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\tsound.fade(from, to, duration, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * get/set the position of playback for a sound.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [seek] - the position to move current playback to (in seconds).\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will changed.\n * @returns {number} return the current seek position (if no extra parameters were given)\n * @example\n * // return the current position of the background music\n * let current_pos = me.audio.seek(\"dst-gameforest\");\n * // set back the position of the background music to the beginning\n * me.audio.seek(\"dst-gameforest\", 0);\n */\nexport function seek(sound_name, ...args) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.seek(...args);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * get or set the rate of playback for a sound.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [rate] - playback rate : 0.5 to 4.0, with 1.0 being normal speed.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will be changed.\n * @returns {number} return the current playback rate (if no extra parameters were given)\n * @example\n * // get the playback rate of the background music\n * let rate = me.audio.rate(\"dst-gameforest\");\n * // speed up the playback of the background music\n * me.audio.rate(\"dst-gameforest\", 2.0);\n */\nexport function rate(sound_name, ...args) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.rate(...args);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * get or set the stereo panning for the specified sound.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [pan] - the panning value - A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will be changed.\n * @return {number} the current panning value\n * @example\n * me.audio.stereo(\"cling\", -1);\n */\nexport function stereo(sound_name, pan, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.stereo(pan, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * get or set the 3D spatial position for the specified sound.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {Number} x - the x-position of the audio source.\n * @param {Number} y - the y-position of the audio source.\n * @param {Number} z - the z-position of the audio source.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will be changed.\n * @return {Array} the current 3D spatial position: [x, y, z]\n */\nexport function position(sound_name, x, y, z, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.pos(x, y, z, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * Get/set the direction the audio source is pointing in the 3D cartesian coordinate space.\n * Depending on how direction the sound is, based on the `cone` attributes, a sound pointing away from the listener can be quiet or silent.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {Number} x - the x-orientation of the audio source.\n * @param {Number} y - the y-orientation of the audio source.\n * @param {Number} z - the z-orientation of the audio source.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will be changed.\n * @return {Array} the current 3D spatial orientation: [x, y, z]\n */\nexport function orientation(sound_name, x, y, z, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.orientation(x, y, z, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * get or set the panner node's attributes for a sound or group of sounds.\n * See {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Web_audio_spatialization_basics#creating_a_panner_node}\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {Object} [attributes] - the panner attributes to set\n * @param {string} [attributes.coneInnerAngle=360] - A parameter for directional audio sources, this is an angle, in degrees, inside of which there will be no volume reduction.\n * @param {string} [attributes.coneOuterAngle=360] - A parameter for directional audio sources, this is an angle, in degrees, outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * @param {string} [attributes.coneOuterGain=0] - A parameter for directional audio sources, this is the gain outside of the `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * @param {string} [attributes.distanceModel=\"inverse\"] - Determines algorithm used to reduce volume as audio moves away from listener. Can be `linear`, `inverse` or `exponential.\n * @param {string} [attributes.maxDistance=10000] - The maximum distance between source and listener, after which the volume will not be reduced any further.\n * @param {string} [attributes.refDistance=1] - A reference distance for reducing volume as source moves further from the listener. This is simply a variable of the distance model and has a different effect depending on which model is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * @param {string} [attributes.rolloffFactor=1] - How quickly the volume reduces as source moves from listener. This is simply a variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, \u221E]` with `inverse` and `exponential`.\n * @param {string} [attributes.panningModel=\"HRTF\"] - Determines which spatialization algorithm is used to position audio. Can be `HRTF` or `equalpower`.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will be changed.\n * @return {Object} current panner attributes.\n * @example\n * me.audio.panner(\"cling\", {\n * panningModel: 'HRTF',\n * refDistance: 0.8,\n * rolloffFactor: 2.5,\n * distanceModel: 'exponential'\n * });\n */\nexport function panner(sound_name, attributes, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\treturn sound.pannerAttr(attributes, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * stop the specified sound on all channels\n * @param {string} [sound_name] - audio clip name (case sensitive). If none is passed, all sounds are stopped.\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will stop.\n * @example\n * me.audio.stop(\"cling\");\n */\nexport function stop(sound_name, id) {\n\tif (typeof sound_name !== \"undefined\") {\n\t\tconst sound = audioTracks[sound_name];\n\t\tif (sound && typeof sound !== \"undefined\") {\n\t\t\tsound.stop(id);\n\t\t\t// remove the defined onend callback (if any defined)\n\t\t\tsound.off(\"end\", undefined, id);\n\t\t} else {\n\t\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t\t}\n\t} else {\n\t\tHowler.stop();\n\t}\n}\n\n/**\n * pause the specified sound on all channels<br>\n * this function does not reset the currentTime property\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will pause.\n * @example\n * me.audio.pause(\"cling\");\n */\nexport function pause(sound_name, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\tsound.pause(id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * resume the specified sound on all channels<br>\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will resume.\n * @example\n * // play a audio clip\n * let id = me.audio.play(\"myClip\");\n * ...\n * // pause it\n * me.audio.pause(\"myClip\", id);\n * ...\n * // resume\n * me.audio.resume(\"myClip\", id);\n */\nexport function resume(sound_name, id) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\tsound.play(id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * play the specified audio track<br>\n * this function automatically set the loop property to true<br>\n * and keep track of the current sound being played.\n * @param {string} sound_name - audio track name - case sensitive\n * @param {number} [volume=default] - Float specifying volume (0.0 - 1.0 values accepted).\n * @returns {number} the sound instance ID.\n * @example\n * me.audio.playTrack(\"awesome_music\");\n */\nexport function playTrack(sound_name, volume) {\n\tcurrent_track_id = sound_name;\n\treturn play(current_track_id, true, null, volume);\n}\n\n/**\n * stop the current audio track\n * @see {@link playTrack}\n * @example\n * // play a awesome music\n * me.audio.playTrack(\"awesome_music\");\n * // stop the current music\n * me.audio.stopTrack();\n */\nexport function stopTrack() {\n\tif (current_track_id !== null) {\n\t\taudioTracks[current_track_id].stop();\n\t\tcurrent_track_id = null;\n\t}\n}\n\n/**\n * pause the current audio track\n * @example\n * me.audio.pauseTrack();\n */\nexport function pauseTrack() {\n\tif (current_track_id !== null) {\n\t\taudioTracks[current_track_id].pause();\n\t}\n}\n\n/**\n * resume the previously paused audio track\n * @example\n * // play an awesome music\n * me.audio.playTrack(\"awesome_music\");\n * // pause the audio track\n * me.audio.pauseTrack();\n * // resume the music\n * me.audio.resumeTrack();\n */\nexport function resumeTrack() {\n\tif (current_track_id !== null) {\n\t\taudioTracks[current_track_id].play();\n\t}\n}\n\n/**\n * returns the current track Id\n * @returns {string} audio track name\n */\nexport function getCurrentTrack() {\n\treturn current_track_id;\n}\n\n/**\n * set the default global volume\n * @param {number} volume - Float specifying volume (0.0 - 1.0 values accepted).\n */\nexport function setVolume(volume) {\n\tHowler.volume(volume);\n}\n\n/**\n * get the default global volume\n * @returns {number} current volume value in Float [0.0 - 1.0] .\n */\nexport function getVolume() {\n\treturn Howler.volume();\n}\n\n/**\n * mute or unmute the specified sound, but does not pause the playback.\n * @param {string} sound_name - audio clip name - case sensitive\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will mute.\n * @param {boolean} [mute=true] - True to mute and false to unmute\n * @example\n * // mute the background music\n * me.audio.mute(\"awesome_music\");\n */\nexport function mute(sound_name, id, mute = true) {\n\tconst sound = audioTracks[sound_name];\n\tif (sound && typeof sound !== \"undefined\") {\n\t\tsound.mute(mute, id);\n\t} else {\n\t\tthrow new Error(\"audio clip \" + sound_name + \" does not exist\");\n\t}\n}\n\n/**\n * unmute the specified sound\n * @param {string} sound_name - audio clip name\n * @param {number} [id] - the sound instance ID. If none is passed, all sounds in group will unmute.\n */\nexport function unmute(sound_name, id) {\n\tmute(sound_name, id, false);\n}\n\n/**\n * mute all audio\n */\nexport function muteAll() {\n\tHowler.mute(true);\n}\n\n/**\n * unmute all audio\n */\nexport function unmuteAll() {\n\tHowler.mute(false);\n}\n\n/**\n * Returns true if audio is muted globally.\n * @returns {boolean} true if audio is muted globally\n */\nexport function muted() {\n\treturn Howler._muted;\n}\n\n/**\n * unload specified audio track to free memory\n * @param {string} sound_name - audio track name - case sensitive\n * @returns {boolean} true if unloaded\n * @example\n * me.audio.unload(\"awesome_music\");\n */\nexport function unload(sound_name) {\n\tif (!(sound_name in audioTracks)) {\n\t\treturn false;\n\t}\n\n\t// destroy the Howl object\n\taudioTracks[sound_name].unload();\n\tdelete audioTracks[sound_name];\n\treturn true;\n}\n\n/**\n * unload all audio to free memory\n * @example\n * me.audio.unloadAll();\n */\nexport function unloadAll() {\n\tfor (const sound_name in audioTracks) {\n\t\tif (audioTracks.hasOwnProperty(sound_name)) {\n\t\t\tunload(sound_name);\n\t\t}\n\t}\n}\n", "import { Point } from \"./point.ts\";\n\n/**\n * Represents a point in a 2D coordinate system that can be observed for changes.\n */\n/**\n * Represents an observable point in 2D space.\n */\nexport class ObservablePoint {\n\tprivate _callback: () => void;\n\tprivate _point: Point;\n\tprivate _revoke: () => void;\n\n\tprivate callBackEnabled: boolean = true;\n\n\ttype: \"ObservablePoint\";\n\n\t/**\n\t * Creates a new ObservablePoint instance.\n\t * @param x - The x-coordinate of the point. Default is 0.\n\t * @param y - The y-coordinate of the point. Default is 0.\n\t * @param callback - The callback function to be called when the point changes. Default is undefined.\n\t */\n\tconstructor(x: number = 0, y: number = 0, callback?: () => void) {\n\t\tconst { proxy, revoke } = Proxy.revocable(new Point(x, y), {\n\t\t\tset: (target, property, value) => {\n\t\t\t\tif (property === \"x\" || property === \"y\") {\n\t\t\t\t\tReflect.set(target, property, value);\n\t\t\t\t\tif (this.callBackEnabled) {\n\t\t\t\t\t\tthis._callback?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t});\n\n\t\tthis.callBackEnabled = true;\n\t\tthis._revoke = revoke;\n\t\tthis._point = proxy;\n\n\t\tif (callback) {\n\t\t\tthis.setCallback(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tset(x = 0, y = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._point.x = x;\n\t\tthis._point.y = y;\n\t\tthis._callback?.();\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point without triggering the callback.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetMuted(x = 0, y = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._point.x = x;\n\t\tthis._point.y = y;\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the x-coordinate of the point.\n\t */\n\tget x() {\n\t\treturn this._point.x;\n\t}\n\n\t/**\n\t * Sets the x-coordinate of the point.\n\t * @param value - The new x-coordinate value.\n\t */\n\tset x(value: number) {\n\t\tthis._point.x = value;\n\t}\n\n\t/**\n\t * Gets the y-coordinate of the point.\n\t */\n\tget y() {\n\t\treturn this._point.y;\n\t}\n\n\t/**\n\t * Sets the y-coordinate of the point.\n\t * @param value - The new y-coordinate value.\n\t */\n\tset y(value: number) {\n\t\tthis._point.y = value;\n\t}\n\n\t/**\n\t * Sets the callback function to be called when the point changes.\n\t * @param callback - The callback function.\n\t */\n\tsetCallback(callback: () => void) {\n\t\tthis._callback = callback;\n\t}\n\n\t/**\n\t * Checks if the point is equal to the given coordinates or another ObservablePoint.\n\t * @param x - The x-coordinate or the ObservablePoint to compare.\n\t * @param y - The y-coordinate. Required if the first parameter is a number.\n\t * @returns True if the point is equal to the given coordinates or another ObservablePoint, false otherwise.\n\t */\n\tequals(x: number, y: number): boolean;\n\tequals(point: ObservablePoint): boolean;\n\tequals(xOrPoint: number | ObservablePoint, y?: number) {\n\t\treturn this._point.equals(xOrPoint as any, y as any);\n\t}\n\n\t/**\n\t * Creates a clone of the ObservablePoint.\n\t * @returns A new ObservablePoint instance with the same coordinates and callback function.\n\t */\n\tclone() {\n\t\treturn new ObservablePoint(this._point.x, this._point.y, this._callback);\n\t}\n\n\t/**\n\t * Revokes the proxy object, preventing further access to the ObservablePoint instance.\n\t */\n\trevoke() {\n\t\tthis._revoke();\n\t}\n}\n", "/**\n * @namespace input\n */\n\n/**\n * specify if melonJS should prevent all default browser action on registered events.\n * @public\n * @type {boolean}\n * @default true\n * @name preventDefault\n * @memberof input\n */\nexport let preventDefault = true;\n\nexport * from \"./gamepad.js\";\nexport * from \"./key.ts\";\nexport * from \"./keyboard.ts\";\nexport * from \"./pointerevent.js\";\n", "import { eventEmitter, KEYDOWN, KEYUP } from \"../system/event.ts\";\nimport { isMobile } from \"../system/platform.ts\";\nimport { preventDefault as preventDefaultAction } from \"./input.js\";\n\n// corresponding actions\nconst _keyStatus: Record<string, number> = {};\n\n// lock enable flag for keys\nconst _keyLock: Record<string, boolean> = {};\n\n// actual lock status of each key\nconst _keyLocked: Record<string, boolean> = {};\n\n// List of binded keys being held\nconst _keyRefs: Record<string, Record<number, boolean>> = {};\n\n// whether default event should be prevented for a given keypress\nconst _preventDefaultForKeys: Record<number, boolean> = {};\n\n// list of binded keys\nconst _keyBindings: Record<number, string> = {};\n\ntype KeyEventHandler = (\n\toptions:\n\t\t| { keyCode: number; mouseButton?: number | undefined }\n\t\t| KeyboardEvent,\n) => void;\n\nconst keyDownEvent: KeyEventHandler = (options) => {\n\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\tconst { keyCode } = options;\n\tconst action = _keyBindings[keyCode];\n\n\teventEmitter.emit(\n\t\tKEYDOWN,\n\t\taction,\n\t\tkeyCode,\n\t\taction ? !_keyLocked[action] : true,\n\t);\n\n\tif (action) {\n\t\tif (!_keyLocked[action]) {\n\t\t\tconst trigger =\n\t\t\t\t(\"mouseButton\" in options ? options.mouseButton : undefined) ?? keyCode;\n\t\t\tif (!_keyRefs[action][trigger]) {\n\t\t\t\t_keyStatus[action]++;\n\t\t\t\t_keyRefs[action][trigger] = true;\n\t\t\t}\n\t\t}\n\t\tif (\"preventDefault\" in options && _preventDefaultForKeys[keyCode]) {\n\t\t\toptions.preventDefault();\n\t\t}\n\t}\n};\n\nconst keyUpEvent: KeyEventHandler = (options) => {\n\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\tconst { keyCode } = options;\n\tconst action = _keyBindings[keyCode];\n\n\teventEmitter.emit(KEYUP, action, keyCode);\n\n\tif (action) {\n\t\tconst trigger =\n\t\t\t(\"mouseButton\" in options ? options.mouseButton : undefined) ?? keyCode;\n\t\tdelete _keyRefs[action][trigger];\n\n\t\tif (_keyStatus[action] > 0) {\n\t\t\t_keyStatus[action]--;\n\t\t}\n\n\t\t_keyLocked[action] = false;\n\n\t\tif (\"preventDefault\" in options && _preventDefaultForKeys[keyCode]) {\n\t\t\toptions.preventDefault();\n\t\t}\n\t}\n};\n\n/*\n * PUBLIC STUFF\n */\n\n/**\n * the default target element for keyboard events (usually the window element in which the game is running)\n */\nexport const keyBoardEventTarget = null;\n\nexport function initKeyboardEvent() {\n\tif (!isMobile) {\n\t\tif (globalThis.addEventListener) {\n\t\t\tglobalThis.addEventListener(\n\t\t\t\t\"keydown\",\n\t\t\t\t(e) => {\n\t\t\t\t\tkeyDownEvent(e);\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tglobalThis.addEventListener(\"keyup\", keyUpEvent, false);\n\t\t}\n\t}\n}\n\n/**\n * return the key press status of the specified action\n * @param action - user defined corresponding action\n * @returns true if pressed\n * @example\n * if (me.input.isKeyPressed('left')) {\n * //do something\n * }\n * else if (me.input.isKeyPressed('right')) {\n * //do something else...\n * }\n */\nexport function isKeyPressed(action: string) {\n\tif (_keyStatus[action] && !_keyLocked[action]) {\n\t\tif (_keyLock[action]) {\n\t\t\t_keyLocked[action] = true;\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * return the key status of the specified action\n * @param action - user defined corresponding action\n * @returns down (true) or up(false)\n */\nexport function keyStatus(action: string) {\n\treturn _keyStatus[action] > 0;\n}\n\n/**\n * trigger the specified key (simulated) event <br>\n * @param keyCode - (See {@link input.KEY})\n * @param [status=false] - true to trigger a key down event, or false for key up event\n * @param [mouseButton] - the mouse button to trigger\n * @example\n * // trigger a key press\n * me.input.triggerKeyEvent(me.input.KEY.LEFT, true);\n */\nexport function triggerKeyEvent(\n\tkeyCode: number,\n\tstatus: boolean,\n\tmouseButton?: number,\n) {\n\tconst handler = status ? keyDownEvent : keyUpEvent;\n\thandler({ keyCode, mouseButton });\n}\n\n/**\n * associate a user defined action to a keycode\n * @param keyCode - (See {@link input.KEY})\n * @param action - user defined corresponding action\n * @param [lock=false] - cancel the keypress event once read\n * @param [preventDefault=input.preventDefault] - prevent default browser action\n * @example\n * // enable the keyboard\n * me.input.bindKey(me.input.KEY.LEFT, \"left\");\n * me.input.bindKey(me.input.KEY.RIGHT, \"right\");\n * me.input.bindKey(me.input.KEY.X, \"jump\", true);\n * me.input.bindKey(me.input.KEY.F1, \"options\", true, true);\n */\nexport const bindKey = (\n\tkeyCode: number,\n\taction: string,\n\tlock?: boolean,\n\tpreventDefault = preventDefaultAction,\n) => {\n\t_keyBindings[keyCode] = action;\n\t_preventDefaultForKeys[keyCode] = preventDefault;\n\n\t_keyStatus[action] = 0;\n\t_keyLock[action] = lock ? lock : false;\n\t_keyLocked[action] = false;\n\t_keyRefs[action] = {};\n};\n\n/**\n * return the action associated with the given keycode\n * @param keyCode - (See {@link input.KEY})\n * @returns user defined associated action\n */\nexport function getBindingKey(keyCode: number) {\n\treturn _keyBindings[keyCode];\n}\n\n/**\n * unlock a key manually\n * @param action - user defined corresponding action\n * @example\n * // Unlock jump when touching the ground\n * if (!this.falling && !this.jumping) {\n * me.input.unlockKey(\"jump\");\n * }\n */\nexport function unlockKey(action: string) {\n\t_keyLocked[action] = false;\n}\n\n/**\n * unbind the defined keycode\n * @param keyCode - (See {@link input.KEY})\n * @example\n * me.input.unbindKey(me.input.KEY.LEFT);\n */\nexport function unbindKey(keyCode: number) {\n\t// clear the event status\n\tconst keybinding = _keyBindings[keyCode];\n\t_keyStatus[keybinding] = 0;\n\t_keyLock[keybinding] = false;\n\t_keyRefs[keybinding] = {};\n\t// remove the key binding\n\tdelete _keyBindings[keyCode];\n\tdelete _preventDefaultForKeys[keyCode];\n}\n", "import {\n\teventEmitter,\n\tGAME_BEFORE_UPDATE,\n\tGAMEPAD_CONNECTED,\n\tGAMEPAD_DISCONNECTED,\n\tGAMEPAD_UPDATE,\n} from \"../system/event.ts\";\nimport { getBindingKey, triggerKeyEvent } from \"./keyboard.ts\";\n\n// Analog deadzone\nlet deadzone = 0.1;\n\n/**\n * Normalize axis values for wired Xbox 360\n * @ignore\n */\nfunction wiredXbox360NormalizeFn(value, axis, button) {\n\tif (\n\t\tbutton === this.GAMEPAD.BUTTONS.L2 ||\n\t\tbutton === this.GAMEPAD.BUTTONS.R2\n\t) {\n\t\treturn (value + 1) / 2;\n\t}\n\treturn value;\n}\n\n/**\n * Normalize axis values for OUYA\n * @ignore\n */\nfunction ouyaNormalizeFn(value, axis, button) {\n\tif (value > 0) {\n\t\tif (button === this.GAMEPAD.BUTTONS.L2) {\n\t\t\t// L2 is wonky; seems like the deadzone is around 20000\n\t\t\t// (That's over 15% of the total range!)\n\t\t\tvalue = Math.max(0, value - 20000) / 111070;\n\t\t} else {\n\t\t\t// Normalize [1..65536] => [0.0..0.5]\n\t\t\tvalue = (value - 1) / 131070;\n\t\t}\n\t} else {\n\t\t// Normalize [-65536..-1] => [0.5..1.0]\n\t\tvalue = (65536 + value) / 131070 + 0.5;\n\t}\n\n\treturn value;\n}\n\n// Match vendor and product codes for Firefox\nconst vendorProductRE = /^([0-9a-f]{1,4})-([0-9a-f]{1,4})-/i;\n\n// Match leading zeros\nconst leadingZeroRE = /^0+/;\n\n/**\n * Firefox reports different ids for gamepads depending on the platform:\n * - Windows: vendor and product codes contain leading zeroes\n * - Mac: vendor and product codes are sparse (no leading zeroes)\n *\n * This function normalizes the id to support both formats\n * @ignore\n */\nfunction addMapping(id, mapping) {\n\tconst expanded_id = id.replace(vendorProductRE, (_, a, b) => {\n\t\treturn (\n\t\t\t\"000\".slice(a.length - 1) + a + \"-\" + \"000\".slice(b.length - 1) + b + \"-\"\n\t\t);\n\t});\n\tconst sparse_id = id.replace(vendorProductRE, (_, a, b) => {\n\t\treturn (\n\t\t\ta.replace(leadingZeroRE, \"\") + \"-\" + b.replace(leadingZeroRE, \"\") + \"-\"\n\t\t);\n\t});\n\n\t// Normalize optional parameters\n\tmapping.analog =\n\t\tmapping.analog ||\n\t\tmapping.buttons.map(() => {\n\t\t\treturn -1;\n\t\t});\n\tmapping.normalize_fn =\n\t\tmapping.normalize_fn ||\n\t\tfunction (value) {\n\t\t\treturn value;\n\t\t};\n\n\tremap.set(expanded_id, mapping);\n\tremap.set(sparse_id, mapping);\n}\n\n// binding list\nconst bindings = {};\n\n// mapping list\nconst remap = new Map();\n\n// Default gamepad mappings\n[\n\t// Firefox mappings\n\t[\n\t\t\"45e-28e-Xbox 360 Wired Controller\",\n\t\t{\n\t\t\taxes: [0, 1, 3, 4],\n\t\t\tbuttons: [11, 12, 13, 14, 8, 9, -1, -1, 5, 4, 6, 7, 0, 1, 2, 3, 10],\n\t\t\tanalog: [\n\t\t\t\t-1, -1, -1, -1, -1, -1, 2, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t\t\t],\n\t\t\tnormalize_fn: wiredXbox360NormalizeFn,\n\t\t},\n\t],\n\t[\n\t\t\"54c-268-PLAYSTATION(R)3 Controller\",\n\t\t{\n\t\t\taxes: [0, 1, 2, 3],\n\t\t\tbuttons: [14, 13, 15, 12, 10, 11, 8, 9, 0, 3, 1, 2, 4, 6, 7, 5, 16],\n\t\t},\n\t],\n\t[\n\t\t\"54c-5c4-Wireless Controller\", // PS4 Controller\n\t\t{\n\t\t\taxes: [0, 1, 2, 3],\n\t\t\tbuttons: [1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 12, 13],\n\t\t},\n\t],\n\t[\n\t\t\"2836-1-OUYA Game Controller\",\n\t\t{\n\t\t\taxes: [0, 3, 7, 9],\n\t\t\tbuttons: [3, 6, 4, 5, 7, 8, 15, 16, -1, -1, 9, 10, 11, 12, 13, 14, -1],\n\t\t\tanalog: [\n\t\t\t\t-1, -1, -1, -1, -1, -1, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t\t\t],\n\t\t\tnormalize_fn: ouyaNormalizeFn,\n\t\t},\n\t],\n\n\t// Chrome mappings\n\t[\n\t\t\"OUYA Game Controller (Vendor: 2836 Product: 0001)\",\n\t\t{\n\t\t\taxes: [0, 1, 3, 4],\n\t\t\tbuttons: [0, 3, 1, 2, 4, 5, 12, 13, -1, -1, 6, 7, 8, 9, 10, 11, -1],\n\t\t\tanalog: [\n\t\t\t\t-1, -1, -1, -1, -1, -1, 2, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t\t\t],\n\t\t\tnormalize_fn: ouyaNormalizeFn,\n\t\t},\n\t],\n].forEach((value) => {\n\taddMapping(value[0], value[1]);\n});\n\n/**\n * Update gamepad status\n * @ignore\n */\nconst updateGamepads = function () {\n\tconst gamepads = navigator.getGamepads();\n\n\t// Trigger button bindings\n\tObject.keys(bindings).forEach((index) => {\n\t\tconst gamepad = gamepads[index];\n\t\tif (!gamepad) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet mapping = null;\n\t\tif (gamepad.mapping !== \"standard\") {\n\t\t\tmapping = remap.get(gamepad.id);\n\t\t}\n\n\t\tconst binding = bindings[index];\n\n\t\t// Iterate all buttons that have active bindings\n\t\tObject.keys(binding.buttons).forEach((button) => {\n\t\t\tconst last = binding.buttons[button];\n\t\t\tlet mapped_button = button;\n\t\t\tlet mapped_axis = -1;\n\n\t\t\t// Remap buttons if necessary\n\t\t\tif (mapping) {\n\t\t\t\tmapped_button = mapping.buttons[button];\n\t\t\t\tmapped_axis = mapping.analog[button];\n\t\t\t\tif (mapped_button < 0 && mapped_axis < 0) {\n\t\t\t\t\t// Button is not mapped\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get mapped button\n\t\t\tlet current = gamepad.buttons[mapped_button] || {};\n\n\t\t\t// Remap an axis to an analog button\n\t\t\tif (mapping) {\n\t\t\t\tif (mapped_axis >= 0) {\n\t\t\t\t\tconst value = mapping.normalize_fn(\n\t\t\t\t\t\tgamepad.axes[mapped_axis],\n\t\t\t\t\t\t-1,\n\t\t\t\t\t\t+button,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create a new object, because GamepadButton is read-only\n\t\t\t\t\tcurrent = {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tpressed: current.pressed || Math.abs(value) >= deadzone,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\teventEmitter.emit(GAMEPAD_UPDATE, index, \"buttons\", +button, current);\n\n\t\t\t// Edge detection\n\t\t\tif (!last.pressed && current.pressed) {\n\t\t\t\ttriggerKeyEvent(last.keyCode, true, mapped_button + 256);\n\t\t\t} else if (last.pressed && !current.pressed) {\n\t\t\t\ttriggerKeyEvent(last.keyCode, false, mapped_button + 256);\n\t\t\t}\n\n\t\t\t// Update last button state\n\t\t\tlast.value = current.value;\n\t\t\tlast.pressed = current.pressed;\n\t\t});\n\n\t\t// Iterate all axes that have active bindings\n\t\tObject.keys(binding.axes).forEach((axis) => {\n\t\t\tconst last = binding.axes[axis];\n\t\t\tlet mapped_axis = axis;\n\n\t\t\t// Remap buttons if necessary\n\t\t\tif (mapping) {\n\t\t\t\tmapped_axis = mapping.axes[axis];\n\t\t\t\tif (mapped_axis < 0) {\n\t\t\t\t\t// axe is not mapped\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve the current value and normalize if necessary\n\t\t\tlet value = gamepad.axes[mapped_axis];\n\t\t\tif (typeof value === \"undefined\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mapping) {\n\t\t\t\tvalue = mapping.normalize_fn(value, +axis, -1);\n\t\t\t}\n\t\t\t// normalize value into a [-1, 1] range value (treat 0 as positive)\n\t\t\tlet range = Math.sign(value) || 1;\n\t\t\tif (last[range].keyCode === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst pressed =\n\t\t\t\tMath.abs(value) >= deadzone + Math.abs(last[range].threshold);\n\n\t\t\teventEmitter.emit(GAMEPAD_UPDATE, index, \"axes\", +axis, value);\n\n\t\t\t// Edge detection\n\t\t\tif (!last[range].pressed && pressed) {\n\t\t\t\t// Release the opposite direction, if necessary\n\t\t\t\tif (last[-range].pressed) {\n\t\t\t\t\ttriggerKeyEvent(last[-range].keyCode, false, mapped_axis + 256);\n\t\t\t\t\tlast[-range].value = 0;\n\t\t\t\t\tlast[-range].pressed = false;\n\t\t\t\t}\n\n\t\t\t\ttriggerKeyEvent(last[range].keyCode, true, mapped_axis + 256);\n\t\t\t} else if ((last[range].pressed || last[-range].pressed) && !pressed) {\n\t\t\t\trange = last[range].pressed ? range : -range;\n\t\t\t\ttriggerKeyEvent(last[range].keyCode, false, mapped_axis + 256);\n\t\t\t}\n\n\t\t\t// Update last axis state\n\t\t\tlast[range].value = value;\n\t\t\tlast[range].pressed = pressed;\n\t\t});\n\t});\n};\n\n// gamepad connected callback\nif (\n\tglobalThis.navigator &&\n\ttypeof globalThis.navigator.getGamepads === \"function\"\n) {\n\tglobalThis.addEventListener(\n\t\t\"gamepadconnected\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(GAMEPAD_CONNECTED, e.gamepad);\n\t\t},\n\t\tfalse,\n\t);\n\n\t/*\n\t * gamepad disconnected callback\n\t */\n\tglobalThis.addEventListener(\n\t\t\"gamepaddisconnected\",\n\t\t(e) => {\n\t\t\teventEmitter.emit(GAMEPAD_DISCONNECTED, e.gamepad);\n\t\t},\n\t\tfalse,\n\t);\n}\n\n/*\n * PUBLIC STUFF\n */\n\n/**\n * Namespace for standard gamepad mapping constants\n */\nexport const GAMEPAD = {\n\t/**\n\t * Standard gamepad mapping information for axes<br>\n\t * <ul>\n\t * <li>Left control stick: <code>LX</code> (horizontal), <code>LY</code> (vertical)</li>\n\t * <li>Right control stick: <code>RX</code> (horizontal), <code>RY</code> (vertical)</li>\n\t * <li>Extras: <code>EXTRA_1</code>, <code>EXTRA_2</code>, <code>EXTRA_3</code>, <code>EXTRA_4</code></li>\n\t * </ul>\n\t * @see {@link https://w3c.github.io/gamepad/#remapping}\n\t */\n\tAXES: {\n\t\tLX: 0,\n\t\tLY: 1,\n\t\tRX: 2,\n\t\tRY: 3,\n\t\tEXTRA_1: 4,\n\t\tEXTRA_2: 5,\n\t\tEXTRA_3: 6,\n\t\tEXTRA_4: 7,\n\t},\n\n\t/**\n\t * Standard gamepad mapping information for buttons<br>\n\t * <ul>\n\t * <li>Face buttons: <code>FACE_1</code>, <code>FACE_2</code>, <code>FACE_3</code>, <code>FACE_4</code></li>\n\t * <li>D-Pad: <code>UP</code>, <code>DOWN</code>, <code>LEFT</code>, <code>RIGHT</code></li>\n\t * <li>Shoulder buttons: <code>L1</code>, <code>L2</code>, <code>R1</code>, <code>R2</code></li>\n\t * <li>Analog stick (clicks): <code>L3</code>, <code>R3</code></li>\n\t * <li>Navigation: <code>SELECT</code> (<code>BACK</code>), <code>START</code> (<code>FORWARD</code>), <code>HOME</code></li>\n\t * <li>Extras: <code>EXTRA_1</code>, <code>EXTRA_2</code>, <code>EXTRA_3</code>, <code>EXTRA_4</code></li>\n\t * </ul>\n\t * @see {@link https://w3c.github.io/gamepad/#remapping}\n\t */\n\tBUTTONS: {\n\t\tFACE_1: 0,\n\t\tFACE_2: 1,\n\t\tFACE_3: 2,\n\t\tFACE_4: 3,\n\t\tL1: 4,\n\t\tR1: 5,\n\t\tL2: 6,\n\t\tR2: 7,\n\t\tSELECT: 8,\n\t\tBACK: 8,\n\t\tSTART: 9,\n\t\tFORWARD: 9,\n\t\tL3: 10,\n\t\tR3: 11,\n\t\tUP: 12,\n\t\tDOWN: 13,\n\t\tLEFT: 14,\n\t\tRIGHT: 15,\n\t\tHOME: 16,\n\t\tEXTRA_1: 17,\n\t\tEXTRA_2: 18,\n\t\tEXTRA_3: 19,\n\t\tEXTRA_4: 20,\n\t},\n};\n\n/**\n * Associate a gamepad event to a keycode\n * @param {number} index - Gamepad index\n * @param {object} button - Button/Axis definition\n * @param {string} button.type - \"buttons\" or \"axes\"\n * @param {number} button.code - button or axis code id (See {@link input.GAMEPAD})\n * @param {number} [button.threshold=1] - value indicating when the axis should trigger the keycode (e.g. -0.5 or 0.5)\n * @param {number} keyCode - (See {@link input.KEY})\n * @example\n * // enable the keyboard\n * me.input.bindKey(me.input.KEY.X, \"shoot\");\n * ...\n * // map the lower face button on the first gamepad to the X key\n * me.input.bindGamepad(0, {type:\"buttons\", code: me.input.GAMEPAD.BUTTONS.FACE_1}, me.input.KEY.X);\n * // map the left axis value on the first gamepad to the LEFT key\n * me.input.bindGamepad(0, {type:\"axes\", code: me.input.GAMEPAD.AXES.LX, threshold: -0.5}, me.input.KEY.LEFT);\n */\nexport function bindGamepad(index, button, keyCode) {\n\t// Throw an exception if no action is defined for the specified keycode\n\tif (!getBindingKey(keyCode)) {\n\t\tthrow new Error(\"no action defined for keycode \" + keyCode);\n\t}\n\n\t// register to the the update event if not yet done and supported by the browser\n\t// if not supported, the function will fail silently (-> update loop won't be called)\n\tif (\n\t\t!eventEmitter.hasListener(GAME_BEFORE_UPDATE, updateGamepads) &&\n\t\ttypeof navigator.getGamepads === \"function\"\n\t) {\n\t\teventEmitter.addListener(GAME_BEFORE_UPDATE, updateGamepads);\n\t}\n\n\t// Allocate bindings if not defined\n\tif (!bindings[index]) {\n\t\tbindings[index] = {\n\t\t\taxes: {},\n\t\t\tbuttons: {},\n\t\t};\n\t}\n\n\tconst mapping = {\n\t\tkeyCode: keyCode,\n\t\tvalue: 0,\n\t\tpressed: false,\n\t\tthreshold: button.threshold, // can be undefined\n\t};\n\tconst binding = bindings[index][button.type];\n\n\t// Map the gamepad button or axis to the keycode\n\tif (button.type === \"buttons\") {\n\t\t// buttons are defined by a `gamePadButton` object\n\t\tbinding[button.code] = mapping;\n\t} else if (button.type === \"axes\") {\n\t\t// normalize threshold into a value that can represent both side of the axis\n\t\tconst range = Math.sign(button.threshold) || 1;\n\t\t// axes are defined using two objects; one for negative and one for positive\n\t\tif (!binding[button.code]) {\n\t\t\tbinding[button.code] = {};\n\t\t}\n\t\tconst axes = binding[button.code];\n\t\taxes[range] = mapping;\n\n\t\t// Ensure the opposite axis exists\n\t\tif (!axes[-range]) {\n\t\t\taxes[-range] = {\n\t\t\t\tkeyCode: 0,\n\t\t\t\tvalue: 0,\n\t\t\t\tpressed: false,\n\t\t\t\tthreshold: -range,\n\t\t\t};\n\t\t}\n\t}\n}\n\n/**\n * unbind the defined keycode\n * @param {number} index - Gamepad index\n * @param {number} button - (See {@link input.GAMEPAD})\n * @example\n * me.input.unbindGamepad(0, me.input.GAMEPAD.BUTTONS.FACE_1);\n */\nexport function unbindGamepad(index, button) {\n\tif (!bindings[index]) {\n\t\tthrow new Error(\"no bindings for gamepad \" + index);\n\t}\n\tbindings[index].buttons[button] = {};\n}\n\n/**\n * Set deadzone for analog gamepad inputs<br>\n * The default deadzone is 0.1 (10%) Analog values less than this will be ignored\n * @param {number} value - Deadzone value\n */\nexport function setGamepadDeadzone(value) {\n\tdeadzone = value;\n}\n\n/**\n * specify a custom mapping for a specific gamepad id<br>\n * see below for the default mapping : <br>\n * <center><img src=\"images/gamepad_diagram.png\"/></center><br>\n * @param {string} id - Gamepad id string\n * @param {object} mapping - A hash table\n * @param {number[]} mapping.axes - Standard analog control stick axis locations\n * @param {number[]} mapping.buttons - Standard digital button locations\n * @param {number[]} [mapping.analog] - Analog axis locations for buttons\n * @param {Function} [mapping.normalize_fn] - a function that returns a normalized value in range [-1.0..1.0] for the given value, axis and button\n * @example\n * // A weird controller that has its axis mappings reversed\n * me.input.setGamepadMapping(\"Generic USB Controller\", {\n * \"axes\" : [ 3, 2, 1, 0 ],\n * \"buttons\" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ]\n * });\n *\n * // Mapping extra axes to analog buttons\n * me.input.setGamepadMapping(\"Generic Analog Controller\", {\n * \"axes\" : [ 0, 1, 2, 3 ],\n * \"buttons\" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ],\n *\n * // Raw axis 4 is mapped to GAMEPAD.BUTTONS.FACE_1\n * // Raw axis 5 is mapped to GAMEPAD.BUTTONS.FACE_2\n * // etc...\n * // Also maps left and right triggers\n * \"analog\" : [ 4, 5, 6, 7, -1, -1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],\n *\n * // Normalize the value of button L2: [-1.0..1.0] => [0.0..1.0]\n * \"normalize_fn\" : function (value, axis, button) {\n * return ((button === me.input.GAMEPAD.BUTTONS.L2) ? ((value + 1) / 2) : value) || 0;\n * }\n * });\n */\nexport const setGamepadMapping = addMapping;\n", "/**\n * standard keyboard constants\n */\nexport const KEY = {\n\tBACKSPACE: 8,\n\tTAB: 9,\n\tENTER: 13,\n\tSHIFT: 16,\n\tCTRL: 17,\n\tALT: 18,\n\tPAUSE: 19,\n\tCAPS_LOCK: 20,\n\tESC: 27,\n\tSPACE: 32,\n\tPAGE_UP: 33,\n\tPAGE_DOWN: 34,\n\tEND: 35,\n\tHOME: 36,\n\tLEFT: 37,\n\tUP: 38,\n\tRIGHT: 39,\n\tDOWN: 40,\n\tPRINT_SCREEN: 42,\n\tINSERT: 45,\n\tDELETE: 46,\n\tNUM0: 48,\n\tNUM1: 49,\n\tNUM2: 50,\n\tNUM3: 51,\n\tNUM4: 52,\n\tNUM5: 53,\n\tNUM6: 54,\n\tNUM7: 55,\n\tNUM8: 56,\n\tNUM9: 57,\n\tA: 65,\n\tB: 66,\n\tC: 67,\n\tD: 68,\n\tE: 69,\n\tF: 70,\n\tG: 71,\n\tH: 72,\n\tI: 73,\n\tJ: 74,\n\tK: 75,\n\tL: 76,\n\tM: 77,\n\tN: 78,\n\tO: 79,\n\tP: 80,\n\tQ: 81,\n\tR: 82,\n\tS: 83,\n\tT: 84,\n\tU: 85,\n\tV: 86,\n\tW: 87,\n\tX: 88,\n\tY: 89,\n\tZ: 90,\n\tWINDOW_KEY: 91,\n\tNUMPAD0: 96,\n\tNUMPAD1: 97,\n\tNUMPAD2: 98,\n\tNUMPAD3: 99,\n\tNUMPAD4: 100,\n\tNUMPAD5: 101,\n\tNUMPAD6: 102,\n\tNUMPAD7: 103,\n\tNUMPAD8: 104,\n\tNUMPAD9: 105,\n\tMULTIPLY: 106,\n\tADD: 107,\n\tSUBSTRACT: 109,\n\tDECIMAL: 110,\n\tDIVIDE: 111,\n\tF1: 112,\n\tF2: 113,\n\tF3: 114,\n\tF4: 115,\n\tF5: 116,\n\tF6: 117,\n\tF7: 118,\n\tF8: 119,\n\tF9: 120,\n\tF10: 121,\n\tF11: 122,\n\tF12: 123,\n\tTILDE: 126,\n\tNUM_LOCK: 144,\n\tSCROLL_LOCK: 145,\n\tSEMICOLON: 186,\n\tPLUS: 187,\n\tCOMMA: 188,\n\tMINUS: 189,\n\tPERIOD: 190,\n\tFORWAND_SLASH: 191,\n\tGRAVE_ACCENT: 192,\n\tOPEN_BRACKET: 219,\n\tBACK_SLASH: 220,\n\tCLOSE_BRACKET: 221,\n\tSINGLE_QUOTE: 222,\n};\n", "import { createPool } from \"../system/pool.ts\";\nimport { clamp, random } from \"./math.ts\";\n\n// convert a give color component to it hexadecimal value\nconst charLookup = [\n\t\"0\",\n\t\"1\",\n\t\"2\",\n\t\"3\",\n\t\"4\",\n\t\"5\",\n\t\"6\",\n\t\"7\",\n\t\"8\",\n\t\"9\",\n\t\"A\",\n\t\"B\",\n\t\"C\",\n\t\"D\",\n\t\"E\",\n\t\"F\",\n];\n\nfunction toHex(component: number) {\n\treturn charLookup[(component & 0xf0) >> 4] + charLookup[component & 0x0f];\n}\n\nfunction hue2rgb(p: number, q: number, t: number) {\n\tif (t < 0) {\n\t\tt += 1;\n\t}\n\tif (t > 1) {\n\t\tt -= 1;\n\t}\n\tif (t < 1 / 6) {\n\t\treturn p + (q - p) * 6 * t;\n\t}\n\tif (t < 1 / 2) {\n\t\treturn q;\n\t}\n\tif (t < 2 / 3) {\n\t\treturn p + (q - p) * (2 / 3 - t) * 6;\n\t}\n\treturn p;\n}\n\nconst rgbaRx = /^rgba?\\((\\d+), ?(\\d+), ?(\\d+)(, ?([\\d.]+))?\\)$/;\nconst hex3Rx = /^#([\\da-fA-F])([\\da-fA-F])([\\da-fA-F])$/;\nconst hex4Rx = /^#([\\da-fA-F])([\\da-fA-F])([\\da-fA-F])([\\da-fA-F])$/;\nconst hex6Rx = /^#([\\da-fA-F]{2})([\\da-fA-F]{2})([\\da-fA-F]{2})$/;\nconst hex8Rx =\n\t/^#([\\da-fA-F]{2})([\\da-fA-F]{2})([\\da-fA-F]{2})([\\da-fA-F]{2})$/;\n\nconst CSS_COLORS = [\n\t// CSS1\n\t[\"black\", [0, 0, 0]],\n\t[\"silver\", [192, 192, 129]],\n\t[\"gray\", [128, 128, 128]],\n\t[\"white\", [255, 255, 255]],\n\t[\"maroon\", [128, 0, 0]],\n\t[\"red\", [255, 0, 0]],\n\t[\"purple\", [128, 0, 128]],\n\t[\"fuchsia\", [255, 0, 255]],\n\t[\"green\", [0, 128, 0]],\n\t[\"lime\", [0, 255, 0]],\n\t[\"olive\", [128, 128, 0]],\n\t[\"yellow\", [255, 255, 0]],\n\t[\"navy\", [0, 0, 128]],\n\t[\"blue\", [0, 0, 255]],\n\t[\"teal\", [0, 128, 128]],\n\t[\"aqua\", [0, 255, 255]],\n\n\t// CSS2\n\t[\"orange\", [255, 165, 0]],\n\n\t// CSS3\n\t[\"aliceblue\", [240, 248, 245]],\n\t[\"antiquewhite\", [250, 235, 215]],\n\t[\"aquamarine\", [127, 255, 212]],\n\t[\"azure\", [240, 255, 255]],\n\t[\"beige\", [245, 245, 220]],\n\t[\"bisque\", [255, 228, 196]],\n\t[\"blanchedalmond\", [255, 235, 205]],\n\t[\"blueviolet\", [138, 43, 226]],\n\t[\"brown\", [165, 42, 42]],\n\t[\"burlywood\", [222, 184, 35]],\n\t[\"cadetblue\", [95, 158, 160]],\n\t[\"chartreuse\", [127, 255, 0]],\n\t[\"chocolate\", [210, 105, 30]],\n\t[\"coral\", [255, 127, 80]],\n\t[\"cornflowerblue\", [100, 149, 237]],\n\t[\"cornsilk\", [255, 248, 220]],\n\t[\"crimson\", [220, 20, 60]],\n\t[\"darkblue\", [0, 0, 139]],\n\t[\"darkcyan\", [0, 139, 139]],\n\t[\"darkgoldenrod\", [184, 134, 11]],\n\t[\"darkgray[*]\", [169, 169, 169]],\n\t[\"darkgreen\", [0, 100, 0]],\n\t[\"darkgrey[*]\", [169, 169, 169]],\n\t[\"darkkhaki\", [189, 183, 107]],\n\t[\"darkmagenta\", [139, 0, 139]],\n\t[\"darkolivegreen\", [85, 107, 47]],\n\t[\"darkorange\", [255, 140, 0]],\n\t[\"darkorchid\", [153, 50, 204]],\n\t[\"darkred\", [139, 0, 0]],\n\t[\"darksalmon\", [233, 150, 122]],\n\t[\"darkseagreen\", [143, 188, 143]],\n\t[\"darkslateblue\", [72, 61, 139]],\n\t[\"darkslategray\", [47, 79, 79]],\n\t[\"darkslategrey\", [47, 79, 79]],\n\t[\"darkturquoise\", [0, 206, 209]],\n\t[\"darkviolet\", [148, 0, 211]],\n\t[\"deeppink\", [255, 20, 147]],\n\t[\"deepskyblue\", [0, 191, 255]],\n\t[\"dimgray\", [105, 105, 105]],\n\t[\"dimgrey\", [105, 105, 105]],\n\t[\"dodgerblue\", [30, 144, 255]],\n\t[\"firebrick\", [178, 34, 34]],\n\t[\"floralwhite\", [255, 250, 240]],\n\t[\"forestgreen\", [34, 139, 34]],\n\t[\"gainsboro\", [220, 220, 220]],\n\t[\"ghostwhite\", [248, 248, 255]],\n\t[\"gold\", [255, 215, 0]],\n\t[\"goldenrod\", [218, 165, 32]],\n\t[\"greenyellow\", [173, 255, 47]],\n\t[\"grey\", [128, 128, 128]],\n\t[\"honeydew\", [240, 255, 240]],\n\t[\"hotpink\", [255, 105, 180]],\n\t[\"indianred\", [205, 92, 92]],\n\t[\"indigo\", [75, 0, 130]],\n\t[\"ivory\", [255, 255, 240]],\n\t[\"khaki\", [240, 230, 140]],\n\t[\"lavender\", [230, 230, 250]],\n\t[\"lavenderblush\", [255, 240, 245]],\n\t[\"lawngreen\", [124, 252, 0]],\n\t[\"lemonchiffon\", [255, 250, 205]],\n\t[\"lightblue\", [173, 216, 230]],\n\t[\"lightcoral\", [240, 128, 128]],\n\t[\"lightcyan\", [224, 255, 255]],\n\t[\"lightgoldenrodyellow\", [250, 250, 210]],\n\t[\"lightgray\", [211, 211, 211]],\n\t[\"lightgreen\", [144, 238, 144]],\n\t[\"lightgrey\", [211, 211, 211]],\n\t[\"lightpink\", [255, 182, 193]],\n\t[\"lightsalmon\", [255, 160, 122]],\n\t[\"lightseagreen\", [32, 178, 170]],\n\t[\"lightskyblue\", [135, 206, 250]],\n\t[\"lightslategray\", [119, 136, 153]],\n\t[\"lightslategrey\", [119, 136, 153]],\n\t[\"lightsteelblue\", [176, 196, 222]],\n\t[\"lightyellow\", [255, 255, 224]],\n\t[\"limegreen\", [50, 205, 50]],\n\t[\"linen\", [250, 240, 230]],\n\t[\"mediumaquamarine\", [102, 205, 170]],\n\t[\"mediumblue\", [0, 0, 205]],\n\t[\"mediumorchid\", [186, 85, 211]],\n\t[\"mediumpurple\", [147, 112, 219]],\n\t[\"mediumseagreen\", [60, 179, 113]],\n\t[\"mediumslateblue\", [123, 104, 238]],\n\t[\"mediumspringgreen\", [0, 250, 154]],\n\t[\"mediumturquoise\", [72, 209, 204]],\n\t[\"mediumvioletred\", [199, 21, 133]],\n\t[\"midnightblue\", [25, 25, 112]],\n\t[\"mintcream\", [245, 255, 250]],\n\t[\"mistyrose\", [255, 228, 225]],\n\t[\"moccasin\", [255, 228, 181]],\n\t[\"navajowhite\", [255, 222, 173]],\n\t[\"oldlace\", [253, 245, 230]],\n\t[\"olivedrab\", [107, 142, 35]],\n\t[\"orangered\", [255, 69, 0]],\n\t[\"orchid\", [218, 112, 214]],\n\t[\"palegoldenrod\", [238, 232, 170]],\n\t[\"palegreen\", [152, 251, 152]],\n\t[\"paleturquoise\", [175, 238, 238]],\n\t[\"palevioletred\", [219, 112, 147]],\n\t[\"papayawhip\", [255, 239, 213]],\n\t[\"peachpuff\", [255, 218, 185]],\n\t[\"peru\", [205, 133, 63]],\n\t[\"pink\", [255, 192, 203]],\n\t[\"plum\", [221, 160, 221]],\n\t[\"powderblue\", [176, 224, 230]],\n\t[\"rosybrown\", [188, 143, 143]],\n\t[\"royalblue\", [65, 105, 225]],\n\t[\"saddlebrown\", [139, 69, 19]],\n\t[\"salmon\", [250, 128, 114]],\n\t[\"sandybrown\", [244, 164, 96]],\n\t[\"seagreen\", [46, 139, 87]],\n\t[\"seashell\", [255, 245, 238]],\n\t[\"sienna\", [160, 82, 45]],\n\t[\"skyblue\", [135, 206, 235]],\n\t[\"slateblue\", [106, 90, 205]],\n\t[\"slategray\", [112, 128, 144]],\n\t[\"slategrey\", [112, 128, 144]],\n\t[\"snow\", [255, 250, 250]],\n\t[\"springgreen\", [0, 255, 127]],\n\t[\"steelblue\", [70, 130, 180]],\n\t[\"tan\", [210, 180, 140]],\n\t[\"thistle\", [216, 191, 216]],\n\t[\"tomato\", [255, 99, 71]],\n\t[\"turquoise\", [64, 224, 208]],\n\t[\"violet\", [238, 130, 238]],\n\t[\"wheat\", [245, 222, 179]],\n\t[\"whitesmoke\", [245, 245, 245]],\n\t[\"yellowgreen\", [154, 205, 50]],\n] as const;\n\ntype ColorName = (typeof CSS_COLORS)[number][0];\n\nconst cssToRGB = new Map<ColorName, readonly [number, number, number]>();\nfor (const [name, rgb] of CSS_COLORS) {\n\tcssToRGB.set(name, rgb);\n}\n\n/**\n * A color manipulation object.\n */\nexport class Color {\n\tprivate glArray: Float32Array;\n\n\t/**\n\t * Creates a new Color instance.\n\t * @param r - A Color object or the red component [0 .. 255]. Defaults to 0.\n\t * @param g - The green component [0 .. 255]. Defaults to 0.\n\t * @param b - The blue component [0 .. 255]. Defaults to 0.\n\t * @param alpha - The alpha value [0.0 .. 1.0]. Defaults to 1.\n\t */\n\tconstructor(r: Color | string | number = 0, g = 0, b = 0, alpha = 1.0) {\n\t\tif (typeof r === \"number\") {\n\t\t\tthis.glArray = new Float32Array([0, 0, 0, 1]);\n\t\t\tthis.setColor(r, g, b, alpha);\n\t\t} else if (typeof r === \"string\") {\n\t\t\tthis.glArray = new Float32Array([0, 0, 0, 1]);\n\t\t\tthis.parseCSS(r as ColorName);\n\t\t} else if (typeof r === \"object\") {\n\t\t\tthis.glArray = r.glArray.slice();\n\t\t} else {\n\t\t\tthrow new Error(\"Color: invalid parameter\");\n\t\t}\n\t}\n\n\t/**\n\t * Gets the red component of the color.\n\t * @returns The red component [0 .. 255].\n\t */\n\tget r() {\n\t\treturn ~~(this.glArray[0] * 255);\n\t}\n\n\t/**\n\t * Sets the red component of the color.\n\t * @param value - The red component [0 .. 255].\n\t */\n\tset r(value) {\n\t\tthis.glArray[0] = clamp(value, 0, 255) / 255.0;\n\t}\n\n\t/**\n\t * Gets the green component of the color.\n\t * @returns The green component [0 .. 255].\n\t */\n\tget g() {\n\t\treturn ~~(this.glArray[1] * 255);\n\t}\n\n\t/**\n\t * Sets the green component of the color.\n\t * @param value - The green component [0 .. 255].\n\t */\n\tset g(value) {\n\t\tthis.glArray[1] = clamp(value, 0, 255) / 255.0;\n\t}\n\n\t/**\n\t * Gets the blue component of the color.\n\t * @returns The blue component [0 .. 255].\n\t */\n\tget b() {\n\t\treturn ~~(this.glArray[2] * 255);\n\t}\n\n\t/**\n\t * Sets the blue component of the color.\n\t * @param value - The blue component [0 .. 255].\n\t */\n\tset b(value) {\n\t\tthis.glArray[2] = clamp(value, 0, 255) / 255.0;\n\t}\n\n\t/**\n\t * Gets the alpha component of the color.\n\t * @returns The alpha component [0.0 .. 1.0].\n\t */\n\tget alpha() {\n\t\treturn this.glArray[3];\n\t}\n\n\t/**\n\t * Sets the alpha component of the color.\n\t * @param value - The alpha component [0.0 .. 1.0].\n\t */\n\tset alpha(value) {\n\t\tthis.glArray[3] = clamp(value, 0, 1.0);\n\t}\n\n\t/**\n\t * Sets the color to the specified values.\n\t * @param r - The red component [0 .. 255].\n\t * @param g - The green component [0 .. 255].\n\t * @param b - The blue component [0 .. 255].\n\t * @param [alpha] - The alpha value [0.0 .. 1.0]. Defaults to 1.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetColor(r: number = 0, g: number = 0, b: number = 0, alpha = 1.0) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.alpha = alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color to the specified normalized float values.\n\t * @param r - The red component [0.0 .. 1.0].\n\t * @param g - The green component [0.0 .. 1.0].\n\t * @param b - The blue component [0.0 .. 1.0].\n\t * @param [alpha=1.0] - The alpha value [0.0 .. 1.0]. Defaults to 1.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetFloat(r: number, g: number, b: number, alpha = 1.0) {\n\t\tconst a = this.glArray;\n\t\ta[0] = clamp(r, 0, 1.0);\n\t\ta[1] = clamp(g, 0, 1.0);\n\t\ta[2] = clamp(b, 0, 1.0);\n\t\ta[3] = clamp(alpha, 0, 1.0);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color to the specified HSV values.\n\t * @param h - The hue [0 .. 1].\n\t * @param s - The saturation [0 .. 1].\n\t * @param v - The value [0 .. 1].\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetHSV(h: number, s: number, v: number) {\n\t\tlet r: number;\n\t\tlet g: number;\n\t\tlet b: number;\n\n\t\tconst i = Math.floor(h * 6);\n\t\tconst f = h * 6 - i;\n\t\tconst p = v * (1 - s);\n\t\tconst q = v * (1 - f * s);\n\t\tconst t = v * (1 - (1 - f) * s);\n\n\t\tswitch ((i % 6) as 0 | 1 | 2 | 3 | 4 | 5) {\n\t\t\tcase 0:\n\t\t\t\tr = v;\n\t\t\t\tg = t;\n\t\t\t\tb = p;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tr = q;\n\t\t\t\tg = v;\n\t\t\t\tb = p;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tr = p;\n\t\t\t\tg = v;\n\t\t\t\tb = t;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tr = p;\n\t\t\t\tg = q;\n\t\t\t\tb = v;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tr = t;\n\t\t\t\tg = p;\n\t\t\t\tb = v;\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tr = v;\n\t\t\t\tg = p;\n\t\t\t\tb = q;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this.setColor(r * 255, g * 255, b * 255);\n\t}\n\n\t/**\n\t * Sets the color to the specified HSL values.\n\t * @param h - The hue [0 .. 1].\n\t * @param s - The saturation [0 .. 1].\n\t * @param l - The lightness [0 .. 1].\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetHSL(h: number, s: number, l: number) {\n\t\tlet r;\n\t\tlet g;\n\t\tlet b;\n\n\t\tif (s === 0) {\n\t\t\tr = g = b = l; // achromatic\n\t\t} else {\n\t\t\tconst q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\t\tconst p = 2 * l - q;\n\n\t\t\tr = hue2rgb(p, q, h + 1 / 3);\n\t\t\tg = hue2rgb(p, q, h);\n\t\t\tb = hue2rgb(p, q, h - 1 / 3);\n\t\t}\n\n\t\treturn this.setColor(r * 255, g * 255, b * 255);\n\t}\n\n\t/**\n\t * Creates a new copy of this color object.\n\t * @returns Reference to the newly cloned object.\n\t */\n\tclone() {\n\t\treturn colorPool.get(this as Color);\n\t}\n\n\t/**\n\t * Copies a color object or CSS color into this one.\n\t * @param color - The color to copy.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tcopy(color: Color | string) {\n\t\tif (typeof color === \"string\") {\n\t\t\treturn this.parseCSS(color as ColorName);\n\t\t} else {\n\t\t\tthis.glArray.set(color.glArray);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * Blends this color with the given one using addition.\n\t * @param color - The color to blend with.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tadd(color: Color) {\n\t\tthis.glArray[0] = clamp(this.glArray[0] + color.glArray[0], 0, 1);\n\t\tthis.glArray[1] = clamp(this.glArray[1] + color.glArray[1], 0, 1);\n\t\tthis.glArray[2] = clamp(this.glArray[2] + color.glArray[2], 0, 1);\n\t\tthis.glArray[3] = (this.glArray[3] + color.glArray[3]) / 2;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Darkens this color value by a given scale.\n\t * @param scale - The scale to darken the color by [0 .. 1].\n\t * @returns Reference to this object for method chaining.\n\t */\n\tdarken(scale: number) {\n\t\tscale = clamp(scale, 0, 1);\n\t\tthis.glArray[0] *= scale;\n\t\tthis.glArray[1] *= scale;\n\t\tthis.glArray[2] *= scale;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between this color and the given one.\n\t * @param color - The color to interpolate with.\n\t * @param alpha - The interpolation factor, with alpha = 0 being this color, and alpha = 1 being the given one.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tlerp(color: Color, alpha: number) {\n\t\talpha = clamp(alpha, 0, 1);\n\t\tthis.glArray[0] += (color.glArray[0] - this.glArray[0]) * alpha;\n\t\tthis.glArray[1] += (color.glArray[1] - this.glArray[1]) * alpha;\n\t\tthis.glArray[2] += (color.glArray[2] - this.glArray[2]) * alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Lightens this color value by a given scale\n\t * @param scale - The scale to lighten the color by [0 .. 1].\n\t * @returns Reference to this object for method chaining.\n\t */\n\tlighten(scale: number) {\n\t\tscale = clamp(scale, 0, 1);\n\t\tthis.glArray[0] = clamp(\n\t\t\tthis.glArray[0] + (1 - this.glArray[0]) * scale,\n\t\t\t0,\n\t\t\t1,\n\t\t);\n\t\tthis.glArray[1] = clamp(\n\t\t\tthis.glArray[1] + (1 - this.glArray[1]) * scale,\n\t\t\t0,\n\t\t\t1,\n\t\t);\n\t\tthis.glArray[2] = clamp(\n\t\t\tthis.glArray[2] + (1 - this.glArray[2]) * scale,\n\t\t\t0,\n\t\t\t1,\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Generate random r,g,b values for this color object\n\t * @param [min] - minimum value for the random range\n\t * @param [max] - maxmium value for the random range\n\t * @returns Reference to this object for method chaining\n\t */\n\trandom(min = 0, max = 255) {\n\t\tif (min < 0) {\n\t\t\tmin = 0;\n\t\t}\n\t\tif (max > 255) {\n\t\t\tmax = 255;\n\t\t}\n\n\t\treturn this.setColor(\n\t\t\trandom(min, max),\n\t\t\trandom(min, max),\n\t\t\trandom(min, max),\n\t\t\tthis.alpha,\n\t\t);\n\t}\n\n\t/**\n\t * Checks if this color is equal to another.\n\t * @param color - The color to compare with.\n\t * @returns True if the colors are equal, otherwise false.\n\t */\n\tequals(color: Color) {\n\t\treturn (\n\t\t\tthis.glArray[0] === color.glArray[0] &&\n\t\t\tthis.glArray[1] === color.glArray[1] &&\n\t\t\tthis.glArray[2] === color.glArray[2] &&\n\t\t\tthis.glArray[3] === color.glArray[3]\n\t\t);\n\t}\n\n\t/**\n\t * Parse a CSS color name and set this color to the corresponding r,g,b values\n\t * @param cssColor - The CSS color name\n\t * @returns Reference to this object for method chaining\n\t */\n\tparseCSS(cssColor: string) {\n\t\tconst rgb = cssToRGB.get(cssColor as ColorName);\n\t\tif (!rgb) {\n\t\t\treturn this.parseRGB(cssColor);\n\t\t}\n\t\treturn this.setColor(...rgb);\n\t}\n\n\t/**\n\t * Parse an RGB or RGBA CSS color string\n\t * @param rgbColor - The RGB or RGBA color string to parse\n\t * @returns Reference to this object for method chaining\n\t */\n\tparseRGB(rgbColor: string) {\n\t\t// TODO : Memoize this function by caching its input\n\n\t\tconst match = rgbaRx.exec(rgbColor);\n\t\tif (!match) {\n\t\t\treturn this.parseHex(rgbColor as `#${string}`);\n\t\t}\n\t\treturn this.setColor(\n\t\t\t+match[1],\n\t\t\t+match[2],\n\t\t\t+match[3],\n\t\t\ttypeof match[5] !== \"undefined\" ? +match[5] : 1,\n\t\t);\n\t}\n\n\t/**\n\t * Parse a Hex color (\"#RGB\", \"#RGBA\" or \"#RRGGBB\", \"#RRGGBBAA\" format) and set this color to\n\t * the corresponding r,g,b,a values\n\t * @param hexColor - The Hex color string to parse\n\t * @param [argb] - true if format is #ARGB, or #AARRGGBB (as opposed to #RGBA or #RGGBBAA)\n\t * @returns Reference to this object for method chaining\n\t */\n\tparseHex(hexColor: `#${string}`, argb = false) {\n\t\t// TODO : Memoize this function by caching its input\n\n\t\tlet match: RegExpExecArray | null;\n\t\tif ((match = hex8Rx.exec(hexColor))) {\n\t\t\t// #AARRGGBB or #RRGGBBAA\n\t\t\treturn this.setColor(\n\t\t\t\tparseInt(match[!argb ? 1 : 2], 16), // r\n\t\t\t\tparseInt(match[!argb ? 2 : 3], 16), // g\n\t\t\t\tparseInt(match[!argb ? 3 : 4], 16), // b\n\t\t\t\tNumber(\n\t\t\t\t\t(clamp(parseInt(match[!argb ? 4 : 1], 16), 0, 255) / 255.0).toFixed(\n\t\t\t\t\t\t1,\n\t\t\t\t\t),\n\t\t\t\t), // a\n\t\t\t);\n\t\t}\n\n\t\tif ((match = hex6Rx.exec(hexColor))) {\n\t\t\t// #RRGGBB\n\t\t\treturn this.setColor(\n\t\t\t\tparseInt(match[1], 16),\n\t\t\t\tparseInt(match[2], 16),\n\t\t\t\tparseInt(match[3], 16),\n\t\t\t);\n\t\t}\n\n\t\tif ((match = hex4Rx.exec(hexColor))) {\n\t\t\t// #ARGB or #RGBA\n\t\t\tconst r = match[!argb ? 1 : 2];\n\t\t\tconst g = match[!argb ? 2 : 3];\n\t\t\tconst b = match[!argb ? 3 : 4];\n\t\t\tconst a = match[!argb ? 4 : 1];\n\t\t\treturn this.setColor(\n\t\t\t\tparseInt(r + r, 16), // r\n\t\t\t\tparseInt(g + g, 16), // g\n\t\t\t\tparseInt(b + b, 16), // b\n\t\t\t\tNumber((clamp(parseInt(a + a, 16), 0, 255) / 255.0).toFixed(1)), // a\n\t\t\t);\n\t\t}\n\n\t\tif ((match = hex3Rx.exec(hexColor))) {\n\t\t\t// #RGB\n\t\t\treturn this.setColor(\n\t\t\t\tparseInt(match[1] + match[1], 16),\n\t\t\t\tparseInt(match[2] + match[2], 16),\n\t\t\t\tparseInt(match[3] + match[3], 16),\n\t\t\t);\n\t\t}\n\n\t\tthrow new Error(`invalid parameter: ${hexColor}`);\n\t}\n\n\t/**\n\t * Pack this color RGB components into a Uint32 ARGB representation\n\t * @param [alpha] - alpha value [0.0 .. 1.0]\n\t * @returns A Uint32 ARGB representation of this color\n\t */\n\ttoUint32(alpha = 1.0) {\n\t\tconst a = this.glArray;\n\n\t\tconst ur = (a[0] * 255) >> 0;\n\t\tconst ug = (a[1] * 255) >> 0;\n\t\tconst ub = (a[2] * 255) >> 0;\n\n\t\treturn (((alpha * 255) >> 0) << 24) | (ur << 16) | (ug << 8) | ub;\n\t}\n\n\t/**\n\t * return an Float Array representation of this object\n\t * @returns A Float Array representation of this color\n\t */\n\ttoArray() {\n\t\treturn this.glArray;\n\t}\n\n\t/**\n\t * return the color in \"#RRGGBB\" format\n\t * @returns The color in \"#RRGGBB\" format\n\t */\n\ttoHex() {\n\t\t// TODO : Memoize this function by caching its result until any of\n\t\t// the r,g,b,a values are changed\n\n\t\treturn `#${toHex(this.r)}${toHex(this.g)}${toHex(this.b)}`;\n\t}\n\n\t/**\n\t * Get the color in \"#RRGGBBAA\" format\n\t * @param alpha - The alpha value [0.0 .. 1.0] to use in the output string.\n\t * @returns The color in \"#RRGGBBAA\" format\n\t */\n\ttoHex8(alpha = this.alpha) {\n\t\t// TODO : Memoize this function by caching its result until any of\n\t\t// the r,g,b,a values are changed\n\n\t\treturn `#${toHex(this.r)}${toHex(this.g)}${toHex(this.b)}${toHex(alpha * 255)}`;\n\t}\n\n\t/**\n\t * Get the color in \"rgb(R,G,B)\" format\n\t * @returns The color in \"rgb(R,G,B)\" format\n\t */\n\ttoRGB() {\n\t\t// TODO : Memoize this function by caching its result until any of\n\t\t// the r,g,b,a values are changed\n\n\t\treturn `rgb(${this.r},${this.g},${this.b})` as const;\n\t}\n\n\t/**\n\t * Get the color in \"rgba(R,G,B,A)\" format\n\t * @param [alpha] - alpha value [0.0 .. 1.0]\n\t * @returns The color in \"rgba(R,G,B,A)\" format\n\t */\n\ttoRGBA(alpha = this.alpha) {\n\t\t// TODO : Memoize this function by caching its result until any of\n\t\t// the r,g,b,a values are changed\n\n\t\treturn `rgba(${this.r},${this.g},${this.b},${alpha})` as const;\n\t}\n}\n\nexport const colorPool = createPool<\n\tColor,\n\t[\n\t\tr?: number | string | Color | undefined,\n\t\tg?: number | undefined,\n\t\tb?: number | undefined,\n\t\talpha?: number | undefined,\n\t]\n>((r, g, b, alpha) => {\n\tconst color = new Color(r, g, b, alpha);\n\treturn {\n\t\tinstance: color,\n\t\treset(r, g, b, alpha) {\n\t\t\tif (arguments.length === 0) {\n\t\t\t\tcolor.setColor();\n\t\t\t} else {\n\t\t\t\tif (typeof r === \"number\") {\n\t\t\t\t\tcolor.setColor(r, g, b, alpha);\n\t\t\t\t} else {\n\t\t\t\t\tcolor.copy(r as Color | string);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n});\n", "import { createPool } from \"../system/pool.ts\";\nimport { XYPoint } from \"../utils/types.ts\";\nimport { clamp } from \"./math.ts\";\nimport { Vector2d } from \"./vector2d.ts\";\n\n/**\n * a generic 3D Vector Object\n */\nexport class Vector3d {\n\tx: number;\n\ty: number;\n\tz: number;\n\n\t/**\n\t * @param [x] - x value of the vector\n\t * @param [y] - y value of the vector\n\t * @param [z] - z value of the vector\n\t */\n\tconstructor(x = 0, y = 0, z = 0) {\n\t\tthis.onResetEvent(x, y, z);\n\t}\n\n\tonResetEvent(x = 0, y = 0, z = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to the given values\n\t * @param x x component\n\t * @param y y component\n\t * @param [z] z component\n\t * @returns Reference to this object for method chaining\n\t */\n\tset(x: number, y: number, z: number | undefined = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to 0\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetZero() {\n\t\treturn this.set(0, 0, 0);\n\t}\n\n\t/**\n\t * set the Vector x and y properties using the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetV(v: Vector2d | Vector3d) {\n\t\treturn this.set(v.x, v.y, \"z\" in v ? v.z : undefined);\n\t}\n\n\t/**\n\t * Add the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tadd(v: Vector2d | Vector3d) {\n\t\treturn this.set(this.x + v.x, this.y + v.y, this.z + (\"z\" in v ? v.z : 0));\n\t}\n\n\t/**\n\t * Substract the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsub(v: Vector2d | Vector3d) {\n\t\treturn this.set(this.x - v.x, this.y - v.y, this.z - (\"z\" in v ? v.z : 0));\n\t}\n\n\t/**\n\t * Multiply this vector values by the given scalar\n\t * @param x x component\n\t * @param [y] y component\n\t * @param [z] z component\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x, z = 1) {\n\t\treturn this.set(this.x * x, this.y * y, this.z * z);\n\t}\n\n\t/**\n\t * Multiply this vector values by the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector3d) {\n\t\treturn this.scale(v.x, v.y, v.z);\n\t}\n\n\t/**\n\t * Convert this vector into isometric coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\ttoIso() {\n\t\treturn this.set(this.x - this.y, (this.x + this.y) * 0.5, this.z);\n\t}\n\n\t/**\n\t * Convert this vector into 2d coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\tto2d() {\n\t\treturn this.set(this.y + this.x / 2, this.y - this.x / 2, this.z);\n\t}\n\n\t/**\n\t * Divide this vector values by the passed value\n\t * @param n - the value to divide the vector by\n\t * @returns Reference to this object for method chaining\n\t */\n\tdiv(n: number) {\n\t\treturn this.set(this.x / n, this.y / n, this.z / n);\n\t}\n\n\t/**\n\t * Update this vector values to absolute values\n\t * @returns Reference to this object for method chaining\n\t */\n\tabs() {\n\t\treturn this.set(\n\t\t\tthis.x < 0 ? -this.x : this.x,\n\t\t\tthis.y < 0 ? -this.y : this.y,\n\t\t\tthis.z < 0 ? -this.z : this.z,\n\t\t);\n\t}\n\n\t/**\n\t * Clamp the vector value within the specified value range\n\t * @param low lower bound\n\t * @param high upper bound\n\t * @returns new Vector3d\n\t */\n\tclamp(low: number, high: number) {\n\t\treturn new Vector3d(\n\t\t\tclamp(this.x, low, high),\n\t\t\tclamp(this.y, low, high),\n\t\t\tclamp(this.z, low, high),\n\t\t);\n\t}\n\n\t/**\n\t * Clamp this vector value within the specified value range\n\t * @param low lower bound\n\t * @param high upper bound\n\t * @returns Reference to this object for method chaining\n\t */\n\tclampSelf(low: number, high: number) {\n\t\treturn this.set(\n\t\t\tclamp(this.x, low, high),\n\t\t\tclamp(this.y, low, high),\n\t\t\tclamp(this.z, low, high),\n\t\t);\n\t}\n\n\t/**\n\t * Update this vector with the minimum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tminV(v: Vector2d | Vector3d) {\n\t\tconst _vz = \"z\" in v ? v.z : 0;\n\t\treturn this.set(\n\t\t\tthis.x < v.x ? this.x : v.x,\n\t\t\tthis.y < v.y ? this.y : v.y,\n\t\t\tthis.z < _vz ? this.z : _vz,\n\t\t);\n\t}\n\n\t/**\n\t * Update this vector with the maximum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tmaxV(v: Vector2d | Vector3d) {\n\t\tconst _vz = \"z\" in v ? v.z : 0;\n\t\treturn this.set(\n\t\t\tthis.x > v.x ? this.x : v.x,\n\t\t\tthis.y > v.y ? this.y : v.y,\n\t\t\tthis.z > _vz ? this.z : _vz,\n\t\t);\n\t}\n\n\t/**\n\t * Floor the vector values\n\t * @returns new Vector3d\n\t */\n\tfloor() {\n\t\treturn new Vector3d(\n\t\t\tMath.floor(this.x),\n\t\t\tMath.floor(this.y),\n\t\t\tMath.floor(this.z),\n\t\t);\n\t}\n\n\t/**\n\t * Floor this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tfloorSelf() {\n\t\treturn this.set(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));\n\t}\n\n\t/**\n\t * Ceil the vector values\n\t * @returns new Vector3d\n\t */\n\tceil() {\n\t\treturn new Vector3d(\n\t\t\tMath.ceil(this.x),\n\t\t\tMath.ceil(this.y),\n\t\t\tMath.ceil(this.z),\n\t\t);\n\t}\n\n\t/**\n\t * Ceil this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tceilSelf() {\n\t\treturn this.set(Math.ceil(this.x), Math.ceil(this.y), Math.ceil(this.z));\n\t}\n\n\t/**\n\t * Negate the vector values\n\t * @returns new Vector3d\n\t */\n\tnegate() {\n\t\treturn new Vector3d(-this.x, -this.y, -this.z);\n\t}\n\n\t/**\n\t * Negate this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tnegateSelf() {\n\t\treturn this.set(-this.x, -this.y, -this.z);\n\t}\n\n\t/**\n\t * Copy the components of the given vector into this one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(v: Vector2d | Vector3d) {\n\t\treturn this.set(v.x, v.y, \"z\" in v ? v.z : 0);\n\t}\n\n\t/**\n\t * return true if this vector is equal to the given values or vector\n\t * @param args other vector or vector components\n\t * @returns true if both vectors are equal\n\t */\n\tequals(\n\t\t...args:\n\t\t\t| [number]\n\t\t\t| [Vector2d]\n\t\t\t| [Vector3d]\n\t\t\t| [number, number]\n\t\t\t| [number, number, number]\n\t): boolean {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\t\tlet _z: number;\n\n\t\tif (args.length === 1) {\n\t\t\tconst arg = args[0];\n\t\t\tif (arg instanceof Vector2d || arg instanceof Vector3d) {\n\t\t\t\t[_x, _y, _z] = [arg.x, arg.y, \"z\" in arg ? arg.z : this.z];\n\t\t\t} else {\n\t\t\t\t_x = arg;\n\t\t\t\t_y = this.y;\n\t\t\t\t_z = this.z;\n\t\t\t}\n\t\t} else if (args.length === 2) {\n\t\t\t[_x, _y, _z] = [args[0], args[1], this.z];\n\t\t} else {\n\t\t\t[_x, _y, _z] = args;\n\t\t}\n\n\t\treturn this.x === _x && this.y === _y && this.z === _z;\n\t}\n\n\t/**\n\t * normalize this vector (scale the vector so that its magnitude is 1)\n\t * @returns Reference to this object for method chaining\n\t */\n\tnormalize() {\n\t\treturn this.div(this.length() || 1);\n\t}\n\n\t/**\n\t * change this vector to be perpendicular to what it was before.<br>\n\t * (Effectively rotates it 90 degrees in a clockwise direction around the z axis)\n\t * @returns Reference to this object for method chaining\n\t */\n\tperp() {\n\t\treturn this.set(this.y, -this.x, this.z);\n\t}\n\n\t/**\n\t * Rotate this vector (counter-clockwise) by the specified angle (in radians) around the z axis\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around (on the same z axis)\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: XYPoint) {\n\t\tlet cx = 0;\n\t\tlet cy = 0;\n\n\t\tif (v) {\n\t\t\tcx = v.x;\n\t\t\tcy = v.y;\n\t\t}\n\n\t\t// TODO also rotate on the z axis if the given vector is a 3d one\n\t\tconst x = this.x - cx;\n\t\tconst y = this.y - cy;\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\n\t\treturn this.set(x * c - y * s + cx, x * s + y * c + cy, this.z);\n\t}\n\n\t/**\n\t * return the dot product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The dot product.\n\t */\n\tdot(v: Vector2d | Vector3d) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * (\"z\" in v ? v.z : this.z);\n\t}\n\n\t/**\n\t * calculate the cross product of this vector and the passed one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcross(v: Vector3d) {\n\t\tconst ax = this.x;\n\t\tconst ay = this.y;\n\t\tconst az = this.z;\n\t\tconst bx = v.x;\n\t\tconst by = v.y;\n\t\tconst bz = v.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * return the square length of this vector\n\t * @returns The length^2 of this vector.\n\t */\n\tlength2(): number {\n\t\treturn this.dot(this);\n\t}\n\n\t/**\n\t * return the length (magnitude) of this vector\n\t * @returns the length of this vector\n\t */\n\tlength() {\n\t\treturn Math.sqrt(this.length2());\n\t}\n\n\t/**\n\t * Linearly interpolate between this vector and the given one.\n\t * @param v other vector\n\t * @param alpha - distance along the line (alpha = 0 will be this vector, and alpha = 1 will be the given one).\n\t * @returns Reference to this object for method chaining\n\t */\n\tlerp(v: Vector3d, alpha: number) {\n\t\tthis.x += (v.x - this.x) * alpha;\n\t\tthis.y += (v.y - this.y) * alpha;\n\t\tthis.z += (v.z - this.z) * alpha;\n\t\treturn this;\n\t}\n\n\t/**\n\t * interpolate the position of this vector on the x and y axis towards the given one by the given maximum step.\n\t * @param target other vector\n\t * @param step - the maximum step per iteration (Negative values will push the vector away from the target)\n\t * @returns Reference to this object for method chaining\n\t */\n\tmoveTowards(target: Vector2d | Vector3d, step: number) {\n\t\tconst angle = Math.atan2(target.y - this.y, target.x - this.x);\n\n\t\tconst dx = this.x - target.x;\n\t\tconst dy = this.y - target.y;\n\n\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\tif (distance === 0 || (step >= 0 && distance <= step * step)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tthis.x += Math.cos(angle) * step;\n\t\tthis.y += Math.sin(angle) * step;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * return the distance between this vector and the passed one\n\t * @param v other vector\n\t * @returns distance\n\t */\n\tdistance(v: Vector2d | Vector3d) {\n\t\tconst dx = this.x - v.x;\n\t\tconst dy = this.y - v.y;\n\t\tconst dz = this.z - (\"z\" in v ? v.z : 0);\n\t\treturn Math.sqrt(dx * dx + dy * dy + dz * dz);\n\t}\n\n\t/**\n\t * return the angle between this vector and the passed one\n\t * @param v other vector\n\t * @returns angle in radians\n\t */\n\tangle(v: Vector2d | Vector3d) {\n\t\treturn Math.acos(clamp(this.dot(v) / (this.length() * v.length()), -1, 1));\n\t}\n\n\t/**\n\t * project this vector on to another vector.\n\t * @param v - The vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tproject(v: Vector2d | Vector3d) {\n\t\tconst ratio = this.dot(v) / v.length2();\n\t\treturn this.scale(ratio, ratio, ratio);\n\t}\n\n\t/**\n\t * Project this vector onto a vector of unit length.<br>\n\t * This is slightly more efficient than `project` when dealing with unit vectors.\n\t * @param v - The unit vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tprojectN(v: Vector2d | Vector3d) {\n\t\tconst ratio = this.dot(v) / v.length2();\n\t\treturn this.scale(ratio, ratio, ratio);\n\t}\n\n\t/**\n\t * return a clone copy of this vector\n\t * @returns new Vector3d\n\t */\n\tclone() {\n\t\treturn vector3dPool.get(this.x, this.y, this.z);\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns stringified representation\n\t */\n\ttoString() {\n\t\treturn `x:${this.x},y:${this.y},z:${this.z}` as const;\n\t}\n}\n\nexport const vector3dPool = createPool<\n\tVector3d,\n\t[x?: number | undefined, y?: number | undefined, z?: number | undefined]\n>((x, y, z) => {\n\tconst vector = new Vector3d(x, y, z);\n\n\treturn {\n\t\tinstance: vector,\n\t\treset(x = 0, y = 0, z = 0) {\n\t\t\tvector.x = x;\n\t\t\tvector.y = y;\n\t\t\tvector.z = z;\n\t\t},\n\t};\n});\n", "import { Point } from \"../geometries/point.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { EPSILON } from \"./math.ts\";\nimport { Matrix2d } from \"./matrix2d.ts\";\nimport { Vector2d } from \"./vector2d.ts\";\nimport { Vector3d } from \"./vector3d.ts\";\n\ntype SixteenNumbers = [\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n\tnumber,\n];\n\ntype ConstructorArg = [Matrix3d] | SixteenNumbers | [undefined] | [];\n\nconst reset = (instance: Matrix3d, ...value: ConstructorArg) => {\n\tif (value[0] instanceof Matrix3d) {\n\t\tinstance.copy(value[0]);\n\t} else if (typeof value[0] === \"number\") {\n\t\tinstance.setTransform(...value);\n\t} else {\n\t\tinstance.identity();\n\t}\n};\n\n/**\n * a 4x4 Matrix3d Object\n */\nexport class Matrix3d {\n\t/**\n\t * The matrix values\n\t */\n\tval: Float32Array;\n\n\t/**\n\t * Constructs a new Matrix3d object.\n\t * @param value - The values to initialize the matrix with.\n\t */\n\tconstructor(...value: ConstructorArg) {\n\t\tthis.val = new Float32Array(16);\n\t\treset(this, ...value);\n\t}\n\n\t/**\n\t * Gets the tx component of the matrix.\n\t * @returns The tx component of the matrix.\n\t */\n\tget tx() {\n\t\treturn this.val[12];\n\t}\n\n\t/**\n\t * Gets the ty component of the matrix.\n\t * @returns The ty component of the matrix.\n\t */\n\tget ty() {\n\t\treturn this.val[13];\n\t}\n\n\t/**\n\t * Gets the tz component of the matrix.\n\t * @returns The tz component of the matrix.\n\t */\n\tget tz() {\n\t\treturn this.val[14];\n\t}\n\n\t/**\n\t * reset the transformation matrix to the identity matrix (no transformation).<br>\n\t * the identity matrix and parameters position : <br>\n\t * <img src=\"images/identity-matrix_2x.png\"/>\n\t * @returns Reference to this object for method chaining\n\t */\n\tidentity() {\n\t\treturn this.setTransform(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n\t}\n\n\t/**\n\t * Set the matrix to the specified value.\n\t * @param values - The matrix components.\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetTransform(...values: SixteenNumbers) {\n\t\tconst a = this.val;\n\n\t\ta[0] = values[0];\n\t\ta[1] = values[1];\n\t\ta[2] = values[2];\n\t\ta[3] = values[3];\n\t\ta[4] = values[4];\n\t\ta[5] = values[5];\n\t\ta[6] = values[6];\n\t\ta[7] = values[7];\n\t\ta[8] = values[8];\n\t\ta[9] = values[9];\n\t\ta[10] = values[10];\n\t\ta[11] = values[11];\n\t\ta[12] = values[12];\n\t\ta[13] = values[13];\n\t\ta[14] = values[14];\n\t\ta[15] = values[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies over the values from another me.Matrix3d.\n\t * @param m - the matrix object to copy from\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(m: Matrix3d) {\n\t\tthis.val.set(m.val);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies over the upper-left 2x2 values from the given me.Matrix2d\n\t * @param m - the matrix object to copy from\n\t * @returns Reference to this object for method chaining\n\t */\n\tfromMat2d(m: Matrix2d) {\n\t\tconst b = m.val;\n\t\treturn this.setTransform(\n\t\t\tb[0],\n\t\t\tb[3],\n\t\t\tb[6],\n\t\t\t0,\n\t\t\tb[1],\n\t\t\tb[4],\n\t\t\tb[7],\n\t\t\t0,\n\t\t\tb[2],\n\t\t\tb[5],\n\t\t\tb[8],\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t);\n\t}\n\n\t/**\n\t * multiply both matrix\n\t * @param m - Other matrix\n\t * @returns Reference to this object for method chaining\n\t */\n\tmultiply(m: Matrix3d) {\n\t\tconst a = this.val;\n\t\tconst b = m.val;\n\n\t\tconst a00 = a[0];\n\t\tconst a01 = a[1];\n\t\tconst a02 = a[2];\n\t\tconst a03 = a[3];\n\t\tconst a10 = a[4];\n\t\tconst a11 = a[5];\n\t\tconst a12 = a[6];\n\t\tconst a13 = a[7];\n\t\tconst a20 = a[8];\n\t\tconst a21 = a[9];\n\t\tconst a22 = a[10];\n\t\tconst a23 = a[11];\n\t\tconst a30 = a[12];\n\t\tconst a31 = a[13];\n\t\tconst a32 = a[14];\n\t\tconst a33 = a[15];\n\t\tlet b0 = b[0];\n\t\tlet b1 = b[1];\n\t\tlet b2 = b[2];\n\t\tlet b3 = b[3];\n\n\t\ta[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n\t\ta[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n\t\ta[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n\t\ta[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n\t\tb0 = b[4];\n\t\tb1 = b[5];\n\t\tb2 = b[6];\n\t\tb3 = b[7];\n\n\t\ta[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n\t\ta[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n\t\ta[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n\t\ta[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n\t\tb0 = b[8];\n\t\tb1 = b[9];\n\t\tb2 = b[10];\n\t\tb3 = b[11];\n\n\t\ta[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n\t\ta[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n\t\ta[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n\t\ta[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n\t\tb0 = b[12];\n\t\tb1 = b[13];\n\t\tb2 = b[14];\n\t\tb3 = b[15];\n\n\t\ta[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n\t\ta[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n\t\ta[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n\t\ta[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transpose the value of this matrix.\n\t * @returns Reference to this object for method chaining\n\t */\n\ttranspose() {\n\t\tconst a = this.val;\n\t\tconst a01 = a[1];\n\t\tconst a02 = a[2];\n\t\tconst a03 = a[3];\n\t\tconst a12 = a[6];\n\t\tconst a13 = a[7];\n\t\tconst a23 = a[11];\n\n\t\ta[1] = a[4];\n\t\ta[2] = a[8];\n\t\ta[3] = a[12];\n\t\ta[4] = a01;\n\t\ta[6] = a[9];\n\t\ta[7] = a[13];\n\t\ta[8] = a02;\n\t\ta[9] = a12;\n\t\ta[11] = a[14];\n\t\ta[12] = a03;\n\t\ta[13] = a13;\n\t\ta[14] = a23;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * invert this matrix, causing it to apply the opposite transformation.\n\t * @returns Reference to this object for method chaining\n\t */\n\tinvert() {\n\t\tconst a = this.val;\n\n\t\tconst a00 = a[0];\n\t\tconst a01 = a[1];\n\t\tconst a02 = a[2];\n\t\tconst a03 = a[3];\n\t\tconst a10 = a[4];\n\t\tconst a11 = a[5];\n\t\tconst a12 = a[6];\n\t\tconst a13 = a[7];\n\t\tconst a20 = a[8];\n\t\tconst a21 = a[9];\n\t\tconst a22 = a[10];\n\t\tconst a23 = a[11];\n\t\tconst a30 = a[12];\n\t\tconst a31 = a[13];\n\t\tconst a32 = a[14];\n\t\tconst a33 = a[15];\n\n\t\tconst b00 = a00 * a11 - a01 * a10;\n\t\tconst b01 = a00 * a12 - a02 * a10;\n\t\tconst b02 = a00 * a13 - a03 * a10;\n\t\tconst b03 = a01 * a12 - a02 * a11;\n\n\t\tconst b04 = a01 * a13 - a03 * a11;\n\t\tconst b05 = a02 * a13 - a03 * a12;\n\t\tconst b06 = a20 * a31 - a21 * a30;\n\t\tconst b07 = a20 * a32 - a22 * a30;\n\n\t\tconst b08 = a20 * a33 - a23 * a30;\n\t\tconst b09 = a21 * a32 - a22 * a31;\n\t\tconst b10 = a21 * a33 - a23 * a31;\n\t\tconst b11 = a22 * a33 - a23 * a32;\n\n\t\t// Calculate the determinant\n\t\tlet det =\n\t\t\tb00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n\t\tif (!det) {\n\t\t\treturn this.identity();\n\t\t}\n\n\t\tdet = 1 / det;\n\n\t\ta[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n\t\ta[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n\t\ta[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n\t\ta[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n\t\ta[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n\t\ta[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n\t\ta[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n\t\ta[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n\t\ta[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\t\ta[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\t\ta[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\t\ta[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n\t\ta[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n\t\ta[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n\t\ta[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n\t\ta[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * apply the current transform to the given 2d or 3d vector or point\n\t * @param v - the vector object to be transformed\n\t * @returns result vector object.\n\t */\n\tapply(v: Vector3d | Vector2d | Point) {\n\t\tconst a = this.val;\n\t\tconst x = v.x;\n\t\tconst y = v.y;\n\t\tconst z = \"z\" in v ? v.z : 1;\n\n\t\tconst w = a[3] * x + a[7] * y + a[11] * z + a[15] || 1.0;\n\n\t\tv.x = (a[0] * x + a[4] * y + a[8] * z + a[12]) / w;\n\t\tv.y = (a[1] * x + a[5] * y + a[9] * z + a[13]) / w;\n\n\t\tif (\"z\" in v) {\n\t\t\tv.z = (a[2] * x + a[6] * y + a[10] * z + a[14]) / w;\n\t\t}\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * apply the inverted current transform to the given 2d or 3d vector\n\t * @param v - the vector object to be transformed\n\t * @returns result vector object.\n\t */\n\tapplyInverse(v: Vector3d | Vector2d) {\n\t\t// invert the current matrix\n\t\tconst im = matrix3dPool.get(this).invert();\n\t\t// apply the inverted matrix\n\t\tim.apply(v);\n\n\t\tmatrix3dPool.release(im);\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * generate an orthogonal projection matrix, with the result replacing the current matrix\n\t * <img src=\"images/glOrtho.gif\"/><br>\n\t * @param left - farthest left on the x-axis\n\t * @param right - farthest right on the x-axis\n\t * @param bottom - farthest down on the y-axis\n\t * @param top - farthest up on the y-axis\n\t * @param near - distance to the near clipping plane along the -Z axis\n\t * @param far - distance to the far clipping plane along the -Z axis\n\t * @returns Reference to this object for method chaining\n\t */\n\tortho(\n\t\tleft: number,\n\t\tright: number,\n\t\tbottom: number,\n\t\ttop: number,\n\t\tnear: number,\n\t\tfar: number,\n\t) {\n\t\tconst a = this.val;\n\t\tconst leftRight = 1.0 / (left - right);\n\t\tconst bottomTop = 1.0 / (bottom - top);\n\t\tconst nearFar = 1.0 / (near - far);\n\n\t\ta[0] = -2.0 * leftRight;\n\t\ta[1] = 0.0;\n\t\ta[2] = 0.0;\n\t\ta[3] = 0.0;\n\t\ta[4] = 0.0;\n\t\ta[5] = -2.0 * bottomTop;\n\t\ta[6] = 0.0;\n\t\ta[7] = 0.0;\n\t\ta[8] = 0.0;\n\t\ta[9] = 0.0;\n\t\ta[10] = 2.0 * nearFar;\n\t\ta[11] = 0.0;\n\t\ta[12] = (left + right) * leftRight;\n\t\ta[13] = (top + bottom) * bottomTop;\n\t\ta[14] = (far + near) * nearFar;\n\t\ta[15] = 1.0;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * scale the matrix\n\t * @param x - a number representing the abscissa of the scaling vector.\n\t * @param [y] - a number representing the ordinate of the scaling vector.\n\t * @param [z] - a number representing the depth vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x, z = 0) {\n\t\tconst a = this.val;\n\n\t\ta[0] = a[0] * x;\n\t\ta[1] = a[1] * x;\n\t\ta[2] = a[2] * x;\n\t\ta[3] = a[3] * x;\n\n\t\ta[4] = a[4] * y;\n\t\ta[5] = a[5] * y;\n\t\ta[6] = a[6] * y;\n\t\ta[7] = a[7] * y;\n\n\t\ta[8] = a[8] * z;\n\t\ta[9] = a[9] * z;\n\t\ta[10] = a[10] * z;\n\t\ta[11] = a[11] * z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * adds a 2D scaling transformation.\n\t * @param v - scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector3d) {\n\t\treturn this.scale(v.x, v.y, v.z);\n\t}\n\n\t/**\n\t * specifies a 2D scale operation using the [sx, 1] scaling vector\n\t * @param x - x scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleX(x: number) {\n\t\treturn this.scale(x, 1);\n\t}\n\n\t/**\n\t * specifies a 2D scale operation using the [1,sy] scaling vector\n\t * @param y - y scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleY(y: number) {\n\t\treturn this.scale(1, y);\n\t}\n\n\t/**\n\t * rotate this matrix (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - Rotation angle in radians.\n\t * @param v - the axis to rotate around\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v: Vector3d) {\n\t\tif (angle !== 0) {\n\t\t\tconst a = this.val;\n\t\t\tlet x = v.x;\n\t\t\tlet y = v.y;\n\t\t\tlet z = v.z;\n\n\t\t\tlet len = Math.sqrt(x * x + y * y + z * z);\n\n\t\t\tif (len < EPSILON) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlen = 1 / len;\n\t\t\tx *= len;\n\t\t\ty *= len;\n\t\t\tz *= len;\n\n\t\t\tconst s = Math.sin(angle);\n\t\t\tconst c = Math.cos(angle);\n\t\t\tconst t = 1 - c;\n\n\t\t\tconst a00 = a[0];\n\t\t\tconst a01 = a[1];\n\t\t\tconst a02 = a[2];\n\t\t\tconst a03 = a[3];\n\t\t\tconst a10 = a[4];\n\t\t\tconst a11 = a[5];\n\t\t\tconst a12 = a[6];\n\t\t\tconst a13 = a[7];\n\t\t\tconst a20 = a[8];\n\t\t\tconst a21 = a[9];\n\t\t\tconst a22 = a[10];\n\t\t\tconst a23 = a[11];\n\n\t\t\t// Construct the elements of the rotation matrix\n\t\t\tconst b00 = x * x * t + c;\n\t\t\tconst b01 = y * x * t + z * s;\n\t\t\tconst b02 = z * x * t - y * s;\n\t\t\tconst b10 = x * y * t - z * s;\n\t\t\tconst b11 = y * y * t + c;\n\t\t\tconst b12 = z * y * t + x * s;\n\t\t\tconst b20 = x * z * t + y * s;\n\t\t\tconst b21 = y * z * t - x * s;\n\t\t\tconst b22 = z * z * t + c;\n\n\t\t\t// Perform rotation-specific matrix multiplication\n\t\t\ta[0] = a00 * b00 + a10 * b01 + a20 * b02;\n\t\t\ta[1] = a01 * b00 + a11 * b01 + a21 * b02;\n\t\t\ta[2] = a02 * b00 + a12 * b01 + a22 * b02;\n\t\t\ta[3] = a03 * b00 + a13 * b01 + a23 * b02;\n\t\t\ta[4] = a00 * b10 + a10 * b11 + a20 * b12;\n\t\t\ta[5] = a01 * b10 + a11 * b11 + a21 * b12;\n\t\t\ta[6] = a02 * b10 + a12 * b11 + a22 * b12;\n\t\t\ta[7] = a03 * b10 + a13 * b11 + a23 * b12;\n\t\t\ta[8] = a00 * b20 + a10 * b21 + a20 * b22;\n\t\t\ta[9] = a01 * b20 + a11 * b21 + a21 * b22;\n\t\t\ta[10] = a02 * b20 + a12 * b21 + a22 * b22;\n\t\t\ta[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * translate the matrix position using the given vector\n\t * @param x - a number representing the abscissa of the vector, or a vector object\n\t * @param [y] - a number representing the ordinate of the vector.\n\t * @param [z] - a number representing the depth of the vector\n\t * @returns Reference to this object for method chaining\n\t */\n\ttranslate(x: number, y: number, z?: number): Matrix3d;\n\ttranslate(vector: Vector3d | Vector2d): Matrix3d;\n\ttranslate(xOrVector: Vector3d | Vector2d | number, y?: number, z?: number) {\n\t\tconst a = this.val;\n\t\tlet _x: number;\n\t\tlet _y: number;\n\t\tlet _z: number;\n\n\t\tif (xOrVector instanceof Vector3d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t\t_z = xOrVector.z;\n\t\t} else if (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t\t_z = 0;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t\t_z = z ?? 0;\n\t\t}\n\n\t\ta[12] = a[0] * _x + a[4] * _y + a[8] * _z + a[12];\n\t\ta[13] = a[1] * _x + a[5] * _y + a[9] * _z + a[13];\n\t\ta[14] = a[2] * _x + a[6] * _y + a[10] * _z + a[14];\n\t\ta[15] = a[3] * _x + a[7] * _y + a[11] * _z + a[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Check if the matrix is an identity matrix.\n\t * @returns true if the matrix is an identity matrix\n\t */\n\tisIdentity() {\n\t\tconst a = this.val;\n\n\t\treturn (\n\t\t\ta[0] === 1 &&\n\t\t\ta[1] === 0 &&\n\t\t\ta[2] === 0 &&\n\t\t\ta[3] === 0 &&\n\t\t\ta[4] === 0 &&\n\t\t\ta[5] === 1 &&\n\t\t\ta[6] === 0 &&\n\t\t\ta[7] === 0 &&\n\t\t\ta[8] === 0 &&\n\t\t\ta[9] === 0 &&\n\t\t\ta[10] === 1 &&\n\t\t\ta[11] === 0 &&\n\t\t\ta[12] === 0 &&\n\t\t\ta[13] === 0 &&\n\t\t\ta[14] === 0 &&\n\t\t\ta[15] === 1\n\t\t);\n\t}\n\n\t/**\n\t * return true if the two matrices are identical\n\t * @param m - the other matrix\n\t * @returns true if both are equals\n\t */\n\tequals(m: Matrix3d) {\n\t\tconst b = m.val;\n\t\tconst a = this.val;\n\n\t\treturn (\n\t\t\ta[0] === b[0] &&\n\t\t\ta[1] === b[1] &&\n\t\t\ta[2] === b[2] &&\n\t\t\ta[3] === b[3] &&\n\t\t\ta[4] === b[4] &&\n\t\t\ta[5] === b[5] &&\n\t\t\ta[6] === b[6] &&\n\t\t\ta[7] === b[7] &&\n\t\t\ta[8] === b[8] &&\n\t\t\ta[9] === b[9] &&\n\t\t\ta[10] === b[10] &&\n\t\t\ta[11] === b[11] &&\n\t\t\ta[12] === b[12] &&\n\t\t\ta[13] === b[13] &&\n\t\t\ta[14] === b[14] &&\n\t\t\ta[15] === b[15]\n\t\t);\n\t}\n\n\t/**\n\t * Clone the Matrix\n\t * @returns a cloned matrix\n\t */\n\tclone() {\n\t\treturn matrix3dPool.get(this);\n\t}\n\n\t/**\n\t * return an array representation of this Matrix\n\t * @returns internal matrix values\n\t */\n\ttoArray() {\n\t\treturn this.val;\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns stringified representation\n\t */\n\ttoString() {\n\t\tconst a = this.val;\n\n\t\treturn `Matrix3d(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]}, ${a[4]}, ${a[5]}, ${\n\t\t\ta[6]\n\t\t}, ${a[7]}, ${a[8]}, ${a[9]}, ${a[10]}, ${a[11]}, ${a[12]}, ${a[13]}, ${\n\t\t\ta[14]\n\t\t}, ${a[15]})`;\n\t}\n}\n\nexport const matrix3dPool = createPool<Matrix3d, ConstructorArg>(\n\t(...values) => {\n\t\tconst instance = new Matrix3d(...values);\n\n\t\treturn {\n\t\t\tinstance,\n\t\t\treset(...value) {\n\t\t\t\treset(instance, ...value);\n\t\t\t},\n\t\t};\n\t},\n);\n", "import { Point } from \"../geometries/point.js\";\nimport { createPool } from \"../system/pool.js\";\nimport { Matrix3d } from \"./matrix3d.js\";\nimport { Vector2d } from \"./vector2d.js\";\nimport { Vector3d } from \"./vector3d.js\";\n\ntype ConstructorArg =\n\t| [Matrix2d]\n\t| [Matrix3d]\n\t| [number, number, number, number, number, number]\n\t| [number, number, number, number, number, number, number, number, number]\n\t| [undefined]\n\t| [];\n\nconst reset = (instance: Matrix2d, ...value: ConstructorArg) => {\n\tif (value[0] instanceof Matrix3d) {\n\t\tinstance.fromMat3d(value[0]);\n\t} else if (value[0] instanceof Matrix2d) {\n\t\tinstance.copy(value[0]);\n\t} else if (typeof value[0] === \"number\") {\n\t\tinstance.setTransform(...value);\n\t} else {\n\t\tinstance.identity();\n\t}\n};\n\n/**\n * a Matrix2d Object.<br>\n * the identity matrix and parameters position : <br>\n * <img src=\"images/identity-matrix_2x.png\"/>\n */\nexport class Matrix2d {\n\t/**\n\t * The matrix values\n\t */\n\tval: Float32Array;\n\n\t/**\n\t * Constructs a new Matrix2d object.\n\t * @param value - The values to initialize the matrix with.\n\t */\n\tconstructor(...value: ConstructorArg) {\n\t\tthis.val = new Float32Array(9);\n\t\treset(this, ...value);\n\t}\n\n\t/**\n\t * Gets the tx component of the matrix.\n\t * @returns The tx component of the matrix.\n\t */\n\tget tx() {\n\t\treturn this.val[6];\n\t}\n\n\t/**\n\t * Gets the ty component of the matrix.\n\t * @returns The ty component of the matrix.\n\t */\n\tget ty() {\n\t\treturn this.val[7];\n\t}\n\n\t/**\n\t * reset the transformation matrix to the identity matrix (no transformation).<br>\n\t * the identity matrix and parameters position : <br>\n\t * <img src=\"images/identity-matrix_2x.png\"/>\n\t * @returns Reference to this object for method chaining\n\t */\n\tidentity() {\n\t\tthis.setTransform(1, 0, 0, 0, 1, 0, 0, 0, 1);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the matrix to the specified value.\n\t * @param values - The matrix components.\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetTransform(\n\t\t...values:\n\t\t\t| [number, number, number, number, number, number]\n\t\t\t| [number, number, number, number, number, number, number, number, number]\n\t) {\n\t\tif (values.length === 9) {\n\t\t\tthis.val[0] = values[0]; // a - m00\n\t\t\tthis.val[1] = values[1]; // b - m10\n\t\t\tthis.val[2] = values[2]; // c - m20\n\t\t\tthis.val[3] = values[3]; // d - m01\n\t\t\tthis.val[4] = values[4]; // e - m11\n\t\t\tthis.val[5] = values[5]; // f - m21\n\t\t\tthis.val[6] = values[6]; // g - m02\n\t\t\tthis.val[7] = values[7]; // h - m12\n\t\t\tthis.val[8] = values[8]; // i - m22\n\t\t} else if (values.length === 6) {\n\t\t\tthis.val[0] = values[0]; // a\n\t\t\tthis.val[1] = values[2]; // c\n\t\t\tthis.val[2] = values[4]; // e\n\t\t\tthis.val[3] = values[1]; // b\n\t\t\tthis.val[4] = values[3]; // d\n\t\t\tthis.val[5] = values[5]; // f\n\t\t\tthis.val[6] = 0; // g\n\t\t\tthis.val[7] = 0; // h\n\t\t\tthis.val[8] = 1; // i\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies the current transformation with the matrix described by the arguments of this method.\n\t * @param a a component\n\t * @param b b component\n\t * @param c c component\n\t * @param d d component\n\t * @param e e component\n\t * @param f f component\n\t * @returns Reference to this object for method chaining\n\t */\n\ttransform(a: number, b: number, c: number, d: number, e: number, f: number) {\n\t\tconst v = this.val;\n\t\tconst a0 = v[0];\n\t\tconst a1 = v[1];\n\t\tconst a3 = v[3];\n\t\tconst a4 = v[4];\n\t\tconst b0 = a;\n\t\tconst b1 = b;\n\t\tconst b3 = c;\n\t\tconst b4 = d;\n\t\tconst b6 = e;\n\t\tconst b7 = f;\n\n\t\tv[0] = a0 * b0 + a3 * b1;\n\t\tv[1] = a1 * b0 + a4 * b1;\n\t\tv[3] = a0 * b3 + a3 * b4;\n\t\tv[4] = a1 * b3 + a4 * b4;\n\t\tv[6] += a0 * b6 + a3 * b7;\n\t\tv[7] += a1 * b6 + a4 * b7;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies over the values from another me.Matrix2d.\n\t * @param m - the matrix object to copy from\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(m: Matrix2d) {\n\t\tthis.val.set(m.val);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies over the upper-left 3x3 values from the given Matrix3d\n\t * @param m - the matrix object to copy from\n\t * @returns Reference to this object for method chaining\n\t */\n\tfromMat3d(m: Matrix3d) {\n\t\tthis.val[0] = m.val[0];\n\t\tthis.val[1] = m.val[1];\n\t\tthis.val[2] = m.val[2];\n\t\tthis.val[3] = m.val[4];\n\t\tthis.val[4] = m.val[5];\n\t\tthis.val[5] = m.val[6];\n\t\tthis.val[6] = m.val[8];\n\t\tthis.val[7] = m.val[9];\n\t\tthis.val[8] = m.val[10];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * multiply both matrix\n\t * @param m - the other matrix\n\t * @returns Reference to this object for method chaining\n\t */\n\tmultiply(m: Matrix2d) {\n\t\tconst b = m.val;\n\t\tconst a = this.val;\n\t\tconst a0 = a[0];\n\t\tconst a1 = a[1];\n\t\tconst a3 = a[3];\n\t\tconst a4 = a[4];\n\t\tconst b0 = b[0];\n\t\tconst b1 = b[1];\n\t\tconst b3 = b[3];\n\t\tconst b4 = b[4];\n\t\tconst b6 = b[6];\n\t\tconst b7 = b[7];\n\n\t\ta[0] = a0 * b0 + a3 * b1;\n\t\ta[1] = a1 * b0 + a4 * b1;\n\t\ta[3] = a0 * b3 + a3 * b4;\n\t\ta[4] = a1 * b3 + a4 * b4;\n\t\ta[6] += a0 * b6 + a3 * b7;\n\t\ta[7] += a1 * b6 + a4 * b7;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transpose the value of this matrix.\n\t * @returns Reference to this object for method chaining\n\t */\n\ttranspose() {\n\t\tconst a = this.val;\n\t\tconst a1 = a[1];\n\t\tconst a2 = a[2];\n\t\tconst a5 = a[5];\n\n\t\ta[1] = a[3];\n\t\ta[2] = a[6];\n\t\ta[3] = a1;\n\t\ta[5] = a[7];\n\t\ta[6] = a2;\n\t\ta[7] = a5;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * invert this matrix, causing it to apply the opposite transformation.\n\t * @returns Reference to this object for method chaining\n\t */\n\tinvert() {\n\t\tconst val = this.val;\n\n\t\tconst a = val[0];\n\t\tconst b = val[1];\n\t\tconst c = val[2];\n\t\tconst d = val[3];\n\t\tconst e = val[4];\n\t\tconst f = val[5];\n\t\tconst g = val[6];\n\t\tconst h = val[7];\n\t\tconst i = val[8];\n\n\t\tconst ta = i * e - f * h;\n\t\tconst td = f * g - i * d;\n\t\tconst tg = h * d - e * g;\n\n\t\tconst n = a * ta + b * td + c * tg;\n\n\t\tval[0] = ta / n;\n\t\tval[1] = (c * h - i * b) / n;\n\t\tval[2] = (f * b - c * e) / n;\n\n\t\tval[3] = td / n;\n\t\tval[4] = (i * a - c * g) / n;\n\t\tval[5] = (c * d - f * a) / n;\n\n\t\tval[6] = tg / n;\n\t\tval[7] = (b * g - h * a) / n;\n\t\tval[8] = (e * a - b * d) / n;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * apply the current transform to the given 2d or 3d vector or point\n\t * @param v - the vector object to be transformed\n\t * @returns result vector object.\n\t */\n\tapply(v: Vector2d | Vector3d | Point) {\n\t\tconst a = this.val;\n\t\tconst x = v.x;\n\t\tconst y = v.y;\n\t\tconst z = \"z\" in v ? v.z : 1;\n\n\t\tv.x = x * a[0] + y * a[3] + z * a[6];\n\t\tv.y = x * a[1] + y * a[4] + z * a[7];\n\n\t\tif (\"z\" in v) {\n\t\t\tv.z = x * a[2] + y * a[5] + z * a[8];\n\t\t}\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * apply the inverted current transform to the given 2d vector\n\t * @param v - the vector object to be transformed\n\t * @returns result vector object.\n\t */\n\tapplyInverse(v: Vector2d) {\n\t\tconst a = this.val;\n\t\tconst x = v.x;\n\t\tconst y = v.y;\n\n\t\tconst invD = 1 / (a[0] * a[4] + a[3] * -a[1]);\n\n\t\tv.x =\n\t\t\ta[4] * invD * x + -a[3] * invD * y + (a[7] * a[3] - a[6] * a[4]) * invD;\n\t\tv.y =\n\t\t\ta[0] * invD * y + -a[1] * invD * x + (-a[7] * a[0] + a[6] * a[1]) * invD;\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * scale the matrix\n\t * @param x - a number representing the abscissa of the scaling vector.\n\t * @param [y] - a number representing the ordinate of the scaling vector.\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x) {\n\t\tconst a = this.val;\n\n\t\ta[0] *= x;\n\t\ta[1] *= x;\n\t\t//a[2] *= x; // z axis remains unchanged for 2d scale operation\n\n\t\ta[3] *= y;\n\t\ta[4] *= y;\n\t\t//a[5] *= y; // w axis remains unchanged for 2d scale operation\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * adds a 2D scaling transformation.\n\t * @param v - scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector2d) {\n\t\treturn this.scale(v.x, v.y);\n\t}\n\n\t/**\n\t * specifies a 2D scale operation using the [sx, 1] scaling vector\n\t * @param x - x scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleX(x: number) {\n\t\treturn this.scale(x, 1);\n\t}\n\n\t/**\n\t * specifies a 2D scale operation using the [1,sy] scaling vector\n\t * @param y - y scaling vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleY(y: number) {\n\t\treturn this.scale(1, y);\n\t}\n\n\t/**\n\t * rotate the matrix (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - Rotation angle in radians.\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number) {\n\t\tif (angle !== 0) {\n\t\t\tconst a00 = this.val[0];\n\t\t\tconst a01 = this.val[1];\n\t\t\tconst a02 = this.val[2];\n\t\t\tconst a10 = this.val[3];\n\t\t\tconst a11 = this.val[4];\n\t\t\tconst a12 = this.val[5];\n\t\t\tconst s = Math.sin(angle);\n\t\t\tconst c = Math.cos(angle);\n\n\t\t\tthis.val[0] = c * a00 + s * a10;\n\t\t\tthis.val[1] = c * a01 + s * a11;\n\t\t\tthis.val[2] = c * a02 + s * a12;\n\n\t\t\tthis.val[3] = c * a10 - s * a00;\n\t\t\tthis.val[4] = c * a11 - s * a01;\n\t\t\tthis.val[5] = c * a12 - s * a02;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * translate the matrix position on the horizontal and vertical axis\n\t * @param x - the x coordindates or a vector to translate the matrix by\n\t * @param [y] - the y coordindates to translate the matrix by\n\t * @returns Reference to this object for method chaining\n\t */\n\ttranslate(x: number, y: number): Matrix2d;\n\ttranslate(vector: Vector2d): Matrix2d;\n\ttranslate(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\tthis.val[6] += this.val[0] * _x + this.val[3] * _y;\n\t\tthis.val[7] += this.val[1] * _x + this.val[4] * _y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Check if matrix is an identity matrix.\n\t * @returns true if the matrix is an identity matrix\n\t */\n\tisIdentity() {\n\t\treturn (\n\t\t\tthis.val[0] === 1 &&\n\t\t\tthis.val[1] === 0 &&\n\t\t\tthis.val[2] === 0 &&\n\t\t\tthis.val[3] === 0 &&\n\t\t\tthis.val[4] === 1 &&\n\t\t\tthis.val[5] === 0 &&\n\t\t\tthis.val[6] === 0 &&\n\t\t\tthis.val[7] === 0 &&\n\t\t\tthis.val[8] === 1\n\t\t);\n\t}\n\n\t/**\n\t * return true if the two matrices are identical\n\t * @param m - the other matrix\n\t * @returns true if both are equals\n\t */\n\tequals(m: Matrix2d) {\n\t\treturn (\n\t\t\tthis.val[0] === m.val[0] &&\n\t\t\tthis.val[1] === m.val[1] &&\n\t\t\tthis.val[2] === m.val[2] &&\n\t\t\tthis.val[3] === m.val[3] &&\n\t\t\tthis.val[4] === m.val[4] &&\n\t\t\tthis.val[5] === m.val[5] &&\n\t\t\tthis.val[6] === m.val[6] &&\n\t\t\tthis.val[7] === m.val[7] &&\n\t\t\tthis.val[8] === m.val[8]\n\t\t);\n\t}\n\n\t/**\n\t * Clone the Matrix\n\t * @returns a clones matrix\n\t */\n\tclone() {\n\t\treturn matrix2dPool.get(this);\n\t}\n\n\t/**\n\t * return an array representation of this Matrix\n\t * @returns the internal matrix values\n\t */\n\ttoArray() {\n\t\treturn this.val;\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns string representation of the matrix\n\t */\n\ttoString() {\n\t\tconst a = this.val;\n\n\t\treturn `Matrix2d(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]}, ${a[4]}, ${a[5]}, ${\n\t\t\ta[6]\n\t\t}, ${a[7]}, ${a[8]})`;\n\t}\n}\n\nexport const matrix2dPool = createPool<Matrix2d, ConstructorArg>(\n\t(...values) => {\n\t\tconst instance = new Matrix2d(...values);\n\n\t\treturn {\n\t\t\tinstance,\n\t\t\treset(...value) {\n\t\t\t\treset(instance, ...value);\n\t\t\t},\n\t\t};\n\t},\n);\n", "import { TupleToUnion } from \"type-fest\";\nimport { Point } from \"../geometries/point.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { Vector2d } from \"./vector2d\";\nimport { Vector3d } from \"./vector3d\";\n\nconst propertiesToObserve = [\"x\", \"y\", \"z\"] as const;\ntype ObservableProperty = keyof Pick<\n\tVector3d,\n\tTupleToUnion<typeof propertiesToObserve>\n>;\nconst setOfProperties = new Set<ObservableProperty>(propertiesToObserve);\n\nconst isObservableProperty = (\n\tproperty: string | symbol,\n): property is ObservableProperty => {\n\treturn setOfProperties.has(property as any);\n};\n\n/**\n * Represents a point in a 3D coordinate vector that can be observed for changes.\n */\nexport class ObservableVector3d {\n\tprivate _callback: () => void;\n\tprivate _vector3d: Vector3d;\n\tprivate _revoke: () => void;\n\n\tprivate callBackEnabled: boolean = true;\n\n\t/**\n\t * Creates a new ObservableVector3d instance.\n\t * @param x - The x-coordinate of the vector. Default is 0.\n\t * @param y - The y-coordinate of the vector. Default is 0.\n\t * @param z - The z-coordinate of the vector. Default is 0.\n\t * @param callback - The callback function to be called when the point changes. Default is undefined.\n\t */\n\tconstructor(\n\t\tx: number = 0,\n\t\ty: number = 0,\n\t\tz: number = 0,\n\t\tcallback?: () => void,\n\t) {\n\t\tconst { proxy, revoke } = Proxy.revocable(new Vector3d(x, y, z), {\n\t\t\tset: (target, property, value) => {\n\t\t\t\tif (isObservableProperty(property)) {\n\t\t\t\t\tReflect.set(target, property, value);\n\t\t\t\t\tif (this.callBackEnabled) {\n\t\t\t\t\t\tthis._callback?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t});\n\n\t\tthis._revoke = revoke;\n\t\tthis._vector3d = proxy;\n\n\t\tif (callback) {\n\t\t\tthis.setCallback(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @param z - The new z-coordinate value.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tset(x = 0, y = 0, z = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._vector3d.x = x;\n\t\tthis._vector3d.y = y;\n\t\tthis._vector3d.z = z;\n\t\tthis._callback?.();\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point without triggering the callback.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @param z -\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetMuted(x = 0, y = 0, z = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._vector3d.x = x;\n\t\tthis._vector3d.y = y;\n\t\tthis._vector3d.z = z;\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the x-coordinate of the point.\n\t */\n\tget x() {\n\t\treturn this._vector3d.x;\n\t}\n\n\t/**\n\t * Sets the x-coordinate of the point.\n\t * @param value - The new x-coordinate value.\n\t */\n\tset x(value: number) {\n\t\tthis._vector3d.x = value;\n\t}\n\n\t/**\n\t * Gets the y-coordinate of the point.\n\t */\n\tget y() {\n\t\treturn this._vector3d.y;\n\t}\n\n\t/**\n\t * Sets the y-coordinate of the point.\n\t * @param value - The new y-coordinate value.\n\t */\n\tset y(value: number) {\n\t\tthis._vector3d.y = value;\n\t}\n\n\tget z() {\n\t\treturn this._vector3d.z;\n\t}\n\n\tset z(value: number) {\n\t\tthis._vector3d.z = value;\n\t}\n\n\t/**\n\t * Sets the callback function to be called when the point changes.\n\t * @param callback - The callback function.\n\t */\n\tsetCallback(callback: () => void) {\n\t\tthis._callback = callback;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to 0\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetZero() {\n\t\treturn this.set(0, 0, 0);\n\t}\n\n\t/**\n\t * set the Vector x and y properties using the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetV(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this.set(v.x, v.y, \"z\" in v ? v.z : undefined);\n\t}\n\n\t/**\n\t * Add the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tadd(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this.set(this.x + v.x, this.y + v.y, this.z + (\"z\" in v ? v.z : 0));\n\t}\n\n\t/**\n\t * Substract the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsub(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this.set(this.x - v.x, this.y - v.y, this.z - (\"z\" in v ? v.z : 0));\n\t}\n\n\t/**\n\t * Multiply this vector values by the given scalar\n\t * @param x x component\n\t * @param [y] y component\n\t * @param [z] z component\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x, z = 1) {\n\t\treturn this.set(this.x * x, this.y * y, this.z * z);\n\t}\n\n\t/**\n\t * Multiply this vector values by the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector3d | ObservableVector3d) {\n\t\treturn this.scale(v.x, v.y, v.z);\n\t}\n\n\t/**\n\t * Convert this vector into isometric coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\ttoIso() {\n\t\treturn this.set(this.x - this.y, (this.x + this.y) * 0.5, this.z);\n\t}\n\n\t/**\n\t * Convert this vector into 2d coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\tto2d() {\n\t\treturn this.set(this.y + this.x / 2, this.y - this.x / 2, this.z);\n\t}\n\n\t/**\n\t * Divide this vector values by the passed value\n\t * @param n - the value to divide the vector by\n\t * @returns Reference to this object for method chaining\n\t */\n\tdiv(n: number) {\n\t\treturn this.set(this.x / n, this.y / n, this.z / n);\n\t}\n\n\t/**\n\t * Update this vector values to absolute values\n\t * @returns Reference to this object for method chaining\n\t */\n\tabs() {\n\t\treturn this.set(\n\t\t\tthis.x < 0 ? -this.x : this.x,\n\t\t\tthis.y < 0 ? -this.y : this.y,\n\t\t\tthis.z < 0 ? -this.z : this.z,\n\t\t);\n\t}\n\n\t/**\n\t * Clamp the vector value within the specified value range\n\t * @param low lower bound\n\t * @param high upper bound\n\t * @returns new Vector3d\n\t */\n\tclamp(low: number, high: number) {\n\t\treturn this._vector3d.clamp(low, high);\n\t}\n\n\t/**\n\t * Clamp this vector value within the specified value range\n\t * @param low lower bound\n\t * @param high upper bound\n\t * @returns Reference to this object for method chaining\n\t */\n\tclampSelf(low: number, high: number) {\n\t\treturn this._vector3d.clampSelf(low, high);\n\t}\n\n\t/**\n\t * Update this vector with the minimum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tminV(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\tconst _vz = \"z\" in v ? v.z : 0;\n\t\treturn this.set(\n\t\t\tthis.x < v.x ? this.x : v.x,\n\t\t\tthis.y < v.y ? this.y : v.y,\n\t\t\tthis.z < _vz ? this.z : _vz,\n\t\t);\n\t}\n\n\t/**\n\t * Update this vector with the maximum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tmaxV(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\tconst _vz = \"z\" in v ? v.z : 0;\n\t\treturn this.set(\n\t\t\tthis.x > v.x ? this.x : v.x,\n\t\t\tthis.y > v.y ? this.y : v.y,\n\t\t\tthis.z > _vz ? this.z : _vz,\n\t\t);\n\t}\n\n\t/**\n\t * Floor the vector values\n\t * @returns new Vector3d\n\t */\n\tfloor() {\n\t\treturn this._vector3d.floor();\n\t}\n\n\t/**\n\t * Floor this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tfloorSelf() {\n\t\treturn this._vector3d.floorSelf();\n\t}\n\n\t/**\n\t * Ceil the vector values\n\t * @returns new Vector3d\n\t */\n\tceil() {\n\t\treturn this._vector3d.ceil();\n\t}\n\n\t/**\n\t * Ceil this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tceilSelf() {\n\t\treturn this._vector3d.ceilSelf();\n\t}\n\n\t/**\n\t * Negate the vector values\n\t * @returns new Vector3d\n\t */\n\tnegate() {\n\t\treturn this._vector3d.negate();\n\t}\n\n\t/**\n\t * Negate this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tnegateSelf() {\n\t\treturn this._vector3d.negateSelf();\n\t}\n\n\t/**\n\t * Copy the components of the given vector into this one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this.set(v.x, v.y, \"z\" in v ? v.z : 0);\n\t}\n\n\t/**\n\t * return true if this vector is equal to the given values or vector\n\t * @param args other vector or vector components\n\t * @returns true if both vectors are equal\n\t */\n\tequals(\n\t\t...args:\n\t\t\t| [number]\n\t\t\t| [Vector2d]\n\t\t\t| [Vector3d]\n\t\t\t| [ObservableVector3d]\n\t\t\t| [number, number]\n\t\t\t| [number, number, number]\n\t): boolean {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\t\tlet _z: number;\n\n\t\tif (args.length === 1) {\n\t\t\tconst arg = args[0];\n\t\t\tif (typeof arg === \"object\") {\n\t\t\t\t[_x, _y, _z] = [arg.x, arg.y, \"z\" in arg ? arg.z : this.z];\n\t\t\t} else {\n\t\t\t\t_x = arg;\n\t\t\t\t_y = this.y;\n\t\t\t\t_z = this.z;\n\t\t\t}\n\t\t} else if (args.length === 2) {\n\t\t\t[_x, _y, _z] = [args[0], args[1], this.z];\n\t\t} else {\n\t\t\t[_x, _y, _z] = args;\n\t\t}\n\n\t\treturn this.x === _x && this.y === _y && this.z === _z;\n\t}\n\n\t/**\n\t * normalize this vector (scale the vector so that its magnitude is 1)\n\t * @returns Reference to this object for method chaining\n\t */\n\tnormalize() {\n\t\treturn this._vector3d.normalize();\n\t}\n\n\t/**\n\t * change this vector to be perpendicular to what it was before.<br>\n\t * (Effectively rotates it 90 degrees in a clockwise direction around the z axis)\n\t * @returns Reference to this object for method chaining\n\t */\n\tperp() {\n\t\treturn this._vector3d.perp();\n\t}\n\n\t/**\n\t * Rotate this vector (counter-clockwise) by the specified angle (in radians) around the z axis\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around (on the same z axis)\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: Vector2d | Point) {\n\t\tlet cx = 0;\n\t\tlet cy = 0;\n\n\t\tif (v) {\n\t\t\tcx = v.x;\n\t\t\tcy = v.y;\n\t\t}\n\n\t\t// TODO also rotate on the z axis if the given vector is a 3d one\n\t\tconst x = this.x - cx;\n\t\tconst y = this.y - cy;\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\n\t\treturn this.set(x * c - y * s + cx, x * s + y * c + cy, this.z);\n\t}\n\n\t/**\n\t * return the dot product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The dot product.\n\t */\n\tdot(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this._vector3d.dot(v as Vector3d);\n\t}\n\n\t/**\n\t * calculate the cross product of this vector and the passed one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcross(v: Vector3d | ObservableVector3d) {\n\t\tconst ax = this.x;\n\t\tconst ay = this.y;\n\t\tconst az = this.z;\n\t\tconst bx = v.x;\n\t\tconst by = v.y;\n\t\tconst bz = v.z;\n\n\t\tthis.set(ay * bz - az * by, az * bx - ax * bz, ax * by - ay * bx);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * return the square length of this vector\n\t * @returns The length^2 of this vector.\n\t */\n\tlength2(): number {\n\t\treturn this._vector3d.length2();\n\t}\n\n\t/**\n\t * return the length (magnitude) of this vector\n\t * @returns the length of this vector\n\t */\n\tlength() {\n\t\treturn this._vector3d.length();\n\t}\n\n\t/**\n\t * Linearly interpolate between this vector and the given one.\n\t * @param v other vector\n\t * @param alpha - distance along the line (alpha = 0 will be this vector, and alpha = 1 will be the given one).\n\t * @returns Reference to this object for method chaining\n\t */\n\tlerp(v: Vector3d | ObservableVector3d, alpha: number) {\n\t\tthis.set(\n\t\t\tthis.x + (v.x - this.x) * alpha,\n\t\t\tthis.y + (v.y - this.y) * alpha,\n\t\t\tthis.z + (v.z - this.z) * alpha,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * interpolate the position of this vector on the x and y axis towards the given one by the given maximum step.\n\t * @param target other vector\n\t * @param step - the maximum step per iteration (Negative values will push the vector away from the target)\n\t * @returns Reference to this object for method chaining\n\t */\n\tmoveTowards(target: Vector2d | Vector3d | ObservableVector3d, step: number) {\n\t\tconst angle = Math.atan2(target.y - this.y, target.x - this.x);\n\n\t\tconst dx = this.x - target.x;\n\t\tconst dy = this.y - target.y;\n\n\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\tif (distance === 0 || (step >= 0 && distance <= step * step)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tthis.set(\n\t\t\tthis.x + Math.cos(angle) * step,\n\t\t\tthis.y + Math.sin(angle) * step,\n\t\t\tthis.z,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * return the distance between this vector and the passed one\n\t * @param v other vector\n\t * @returns distance\n\t */\n\tdistance(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this._vector3d.distance(v as Vector3d);\n\t}\n\n\t/**\n\t * return the angle between this vector and the passed one\n\t * @param v other vector\n\t * @returns angle in radians\n\t */\n\tangle(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\treturn this._vector3d.angle(v as Vector3d);\n\t}\n\n\t/**\n\t * project this vector on to another vector.\n\t * @param v - The vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tproject(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\tconst ratio = this.dot(v) / v.length2();\n\t\treturn this.scale(ratio, ratio, ratio);\n\t}\n\n\t/**\n\t * Project this vector onto a vector of unit length.<br>\n\t * This is slightly more efficient than `project` when dealing with unit vectors.\n\t * @param v - The unit vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tprojectN(v: Vector2d | Vector3d | ObservableVector3d) {\n\t\tconst ratio = this.dot(v) / v.length2();\n\t\treturn this.scale(ratio, ratio, ratio);\n\t}\n\n\t/**\n\t * return a clone copy of this vector\n\t * @param [cb] callback function to override the clone values\n\t * @returns new Vector3d\n\t */\n\tclone(cb?: () => void) {\n\t\treturn observableVector3dPool.get(this.x, this.y, this.z, cb);\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns stringified representation\n\t */\n\ttoString() {\n\t\treturn this._vector3d.toString();\n\t}\n\n\t/**\n\t * Revokes the proxy object, preventing further access to the ObservablePoint instance.\n\t */\n\trevoke() {\n\t\tthis._revoke();\n\t}\n}\n\nexport const observableVector3dPool = createPool<\n\tObservableVector3d,\n\t[\n\t\tx?: number | undefined,\n\t\ty?: number | undefined,\n\t\tz?: number | undefined,\n\t\tcallback?: () => void,\n\t]\n>((x, y, z, cb) => {\n\tconst vector = new ObservableVector3d(x, y, z, cb);\n\n\treturn {\n\t\tinstance: vector,\n\t\treset(x = 0, y = 0, z = 0, cb?: () => void): void {\n\t\t\tvector.setMuted(x, y, z);\n\t\t\tif (cb) {\n\t\t\t\tvector.setCallback(cb);\n\t\t\t}\n\t\t},\n\t};\n});\n", "import { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport { Bounds, boundsPool } from \"../physics/bounds.ts\";\nimport { createPool } from \"../system/pool.ts\";\n\n/**\n * an ellipse Object\n */\nexport class Ellipse {\n\t/**\n\t * the center coordinates of the ellipse\n\t */\n\tpos: Vector2d;\n\n\t/**\n\t * The bounding rectangle for this shape\n\t */\n\t_bounds: Bounds;\n\n\t/**\n\t * Maximum radius of the ellipse\n\t */\n\tradius: number;\n\n\t/**\n\t * Pre-scaled radius vector for ellipse\n\t */\n\tradiusV: Vector2d;\n\n\t/**\n\t * Radius squared, for pythagorean theorom\n\t */\n\tradiusSq: Vector2d;\n\n\t/**\n\t * x/y scaling ratio for ellipse\n\t */\n\tratio: Vector2d;\n\n\t/**\n\t * the shape type (used internally)\n\t */\n\ttype = \"Ellipse\";\n\n\t/**\n\t * @param x - the center x coordinate of the ellipse\n\t * @param y - the center y coordinate of the ellipse\n\t * @param w - width (diameter) of the ellipse\n\t * @param h - height (diameter) of the ellipse\n\t */\n\tconstructor(x: number, y: number, w: number, h: number) {\n\t\tthis.pos = new Vector2d();\n\t\tthis._bounds = new Bounds();\n\t\tthis.radius = NaN;\n\t\tthis.radiusV = new Vector2d();\n\t\tthis.radiusSq = new Vector2d();\n\t\tthis.ratio = vector2dPool.get();\n\t\tthis.setShape(x, y, w, h);\n\t}\n\n\t/**\n\t * set new value to the Ellipse shape\n\t * @param x - the center x coordinate of the ellipse\n\t * @param y - the center y coordinate of the ellipse\n\t * @param w - width (diameter) of the ellipse\n\t * @param h - height (diameter) of the ellipse\n\t * @returns this instance for objecf chaining\n\t */\n\tsetShape(x: number, y: number, w: number, h: number) {\n\t\tconst hW = w / 2;\n\t\tconst hH = h / 2;\n\t\tconst radius = Math.max(hW, hH);\n\t\tconst r = radius * radius;\n\n\t\tthis.pos.set(x, y);\n\t\tthis.radius = radius;\n\t\tthis.ratio.set(hW / radius, hH / radius);\n\t\tthis.radiusV.set(radius, radius).scaleV(this.ratio);\n\t\tthis.radiusSq.set(r, r).scaleV(this.ratio);\n\n\t\tconst bounds = this.getBounds();\n\t\t// update the corresponding bounds\n\t\tbounds.setMinMax(x, y, x + w, x + h);\n\t\t// elipse position is the center of the cirble, bounds position are top left\n\t\tbounds.translate(-this.radiusV.x, -this.radiusV.y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Rotate this Ellipse (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: Vector2d) {\n\t\tconst bounds = this.getBounds();\n\t\t// TODO : only works for circle\n\t\tthis.pos.rotate(angle, v);\n\t\tbounds.shift(this.pos);\n\t\tbounds.translate(-this.radiusV.x, -this.radiusV.y);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Scale this Ellipse by the specified scalar.\n\t * @param x - the scale factor along the x-axis\n\t * @param [y=x] - the scale factor along the y-axis\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x) {\n\t\treturn this.setShape(\n\t\t\tthis.pos.x,\n\t\t\tthis.pos.y,\n\t\t\tthis.radiusV.x * 2 * x,\n\t\t\tthis.radiusV.y * 2 * y,\n\t\t);\n\t}\n\n\t/**\n\t * Scale this Ellipse by the specified vector.\n\t * @param v - Scaling vector.\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector2d) {\n\t\treturn this.scale(v.x, v.y);\n\t}\n\n\t/**\n\t * apply the given transformation matrix to this ellipse\n\t * @returns Reference to this object for method chaining\n\t */\n\ttransform() {\n\t\t// TODO\n\t\treturn this;\n\t}\n\n\t/**\n\t * translate the circle/ellipse by the specified offset\n\t * @param x - x coordinate or a vector point to translate by\n\t * @param [y] - y offset\n\t * @returns this ellipse\n\t * @example\n\t * ellipse.translate(10, 10);\n\t * // or\n\t * ellipse.translate(myVector2d);\n\t */\n\ttranslate(x: number, y: number): Ellipse;\n\ttranslate(vector: Vector2d): Ellipse;\n\ttranslate(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\tthis.pos.x += _x;\n\t\tthis.pos.y += _y;\n\t\tthis.getBounds().translate(_x, _y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * check if this circle/ellipse contains the specified point\n\t * @param x - x coordinate or a vector point to check\n\t * @param [y] - y coordinate\n\t * @param args\n\t * @returns true if contains\n\t * @example\n\t * if (circle.contains(10, 10)) {\n\t * // do something\n\t * }\n\t * // or\n\t * if (circle.contains(myVector2d)) {\n\t * // do something\n\t * }\n\t */\n\tcontains(x: number, y: number): boolean;\n\tcontains(vector: Vector2d): boolean;\n\tcontains(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t[_x, _y] = [xOrVector.x, xOrVector.y];\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\t// Make position relative to object center point.\n\t\t_x -= this.pos.x;\n\t\t_y -= this.pos.y;\n\t\t// Pythagorean theorem.\n\t\treturn (_x * _x) / this.radiusSq.x + (_y * _y) / this.radiusSq.y <= 1.0;\n\t}\n\n\t/**\n\t * returns the bounding box for this shape, the smallest Rectangle object completely containing this shape.\n\t * @returns this shape bounding box Rectangle object\n\t */\n\tgetBounds() {\n\t\tif (typeof this._bounds === \"undefined\") {\n\t\t\tthis._bounds = boundsPool.get();\n\t\t}\n\t\treturn this._bounds;\n\t}\n\n\t/**\n\t * clone this Ellipse\n\t * @returns new Ellipse\n\t */\n\tclone() {\n\t\treturn new Ellipse(\n\t\t\tthis.pos.x,\n\t\t\tthis.pos.y,\n\t\t\tthis.radiusV.x * 2,\n\t\t\tthis.radiusV.y * 2,\n\t\t);\n\t}\n}\n\nexport const ellipsePool = createPool<\n\tEllipse,\n\t[x: number, y: number, width: number, height: number]\n>((x, y, width, height) => {\n\tconst instance = new Ellipse(x, y, width, height);\n\n\treturn {\n\t\tinstance,\n\t\treset(x, y, width, height) {\n\t\t\tinstance.setShape(x, y, width, height);\n\t\t},\n\t};\n});\n", "import { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { LineVertices, Polygon } from \"./polygon.ts\";\n\n/**\n * a line segment Object\n * @param x - origin point of the Line\n * @param y - origin point of the Line\n * @param points - array of vectors defining the Line\n */\nexport class Line extends Polygon {\n\t/**\n\t * Returns true if the Line contains the given point\n\t * @param x - x coordinate or a vector point to check\n\t * @param [y] - y coordinate\n\t * @returns true if contains\n\t * @example\n\t * if (line.contains(10, 10)) {\n\t * // do something\n\t * }\n\t * // or\n\t * if (line.contains(myVector2d)) {\n\t * // do something\n\t * }\n\t */\n\toverride contains(x: number, y: number): boolean;\n\toverride contains(vector: Vector2d): boolean;\n\toverride contains(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\t// translate the given coordinates,\n\t\t// rather than creating temp translated vectors\n\t\t_x -= this.pos.x; // Cx\n\t\t_y -= this.pos.y; // Cy\n\t\tconst [start, end] = this.points;\n\n\t\t//(Cy - Ay) * (Bx - Ax) = (By - Ay) * (Cx - Ax)\n\t\treturn (\n\t\t\t(_y - start.y) * (end.x - start.x) === (end.y - start.y) * (_x - start.x)\n\t\t);\n\t}\n\n\t/**\n\t * Computes the calculated collision edges and normals.\n\t * This **must** be called if the `points` array, `angle`, or `offset` is modified manually.\n\t * @returns this instance for objecf chaining\n\t */\n\toverride recalc() {\n\t\tconst edges = this.edges;\n\t\tconst normals = this.normals;\n\t\tconst indices = this.indices;\n\n\t\t// Copy the original points array and apply the offset/angle\n\t\tconst points = this.points;\n\n\t\tif (points.length !== 2) {\n\t\t\tthrow new Error(\"Requires exactly 2 points\");\n\t\t}\n\n\t\t// Calculate the edges/normals\n\t\tif (edges[0] === undefined) {\n\t\t\tedges[0] = vector2dPool.get();\n\t\t}\n\t\tedges[0].copy(points[1]).sub(points[0]);\n\t\tif (normals[0] === undefined) {\n\t\t\tnormals[0] = vector2dPool.get();\n\t\t}\n\t\tnormals[0].copy(edges[0]).perp().normalize();\n\n\t\t// do not do anything here, indices will be computed by\n\t\t// toIndices if array is empty upon function call\n\t\tindices.length = 0;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * clone this line segment\n\t * @returns new Line\n\t */\n\toverride clone() {\n\t\treturn new Line(\n\t\t\tthis.pos.x,\n\t\t\tthis.pos.y,\n\t\t\tthis.points.map((point) => point.clone()) as LineVertices,\n\t\t);\n\t}\n}\n\nexport const linePool = createPool<\n\tLine,\n\t[x: number, y: number, points: LineVertices]\n>((x, y, points) => {\n\tconst line = new Line(x, y, points);\n\treturn {\n\t\tinstance: line,\n\t\treset(x, y, points) {\n\t\t\tline.pos.set(x, y);\n\t\t\tline.setVertices(points);\n\t\t},\n\t};\n});\n", "import { Vector2d } from \"../math/vector2d.ts\";\nimport { createPool } from \"../system/pool.ts\";\nimport { Rect } from \"./rectangle.ts\";\n\n// https://developer.chrome.com/blog/canvas2d/#round-rect\n\nconst DEFAULT_RADIUS = 20;\n\n/**\n * a rectangle object with rounded corners\n */\nexport class RoundRect extends Rect {\n\t/**\n\t * Corner radius.\n\t */\n\t_radius: number;\n\n\t/**\n\t * the shape type (used internally)\n\t */\n\toverride type = \"RoundRect\";\n\n\t/**\n\t * @param x - position of the rounded rectangle\n\t * @param y - position of the rounded rectangle\n\t * @param width - the rectangle width\n\t * @param height - the rectangle height\n\t * @param [radius=20] - the radius of the rounded corner\n\t */\n\tconstructor(\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tradius = DEFAULT_RADIUS,\n\t) {\n\t\tsuper(x, y, width, height);\n\t\tthis.type = \"RoundRect\";\n\t\tthis.radius = radius;\n\t}\n\n\t/**\n\t * the radius of the rounded corner\n\t * @default 20\n\t */\n\tget radius() {\n\t\treturn this._radius;\n\t}\n\tset radius(value) {\n\t\t// verify the rectangle is at least as wide and tall as the rounded corners.\n\t\tif (this.width < 2 * value) {\n\t\t\tvalue = this.width / 2;\n\t\t}\n\t\tif (this.height < 2 * value) {\n\t\t\tvalue = this.height / 2;\n\t\t}\n\t\tthis._radius = value;\n\t}\n\n\t/**\n\t * copy the position, size and radius of the given rounded rectangle into this one\n\t * @param rrect - source rounded rectangle\n\t * @returns new rectangle\n\t */\n\toverride copy(rrect: RoundRect) {\n\t\tthis.pos.set(rrect.pos.x, rrect.pos.y);\n\t\tthis.setSize(rrect.width, rrect.height);\n\t\tthis.radius = rrect.radius;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns true if the rounded rectangle contains the given point or rectangle\n\t * @param x - x coordinate or a vector point, or a Rect to test\n\t * @param [y] - y coordinate\n\t * @returns True if the rounded rectangle contain the given point or rectangle, otherwise false\n\t * @example\n\t * if (rect.contains(10, 10)) {\n\t * // do something\n\t * }\n\t * // or\n\t * if (rect.contains(myVector2d)) {\n\t * // do something\n\t * }\n\t * if (rect.contains(myRect)) {\n\t * // do something\n\t * }\n\t */\n\toverride contains(x: number, y: number): boolean;\n\toverride contains(vector: Vector2d): boolean;\n\toverride contains(xOrVector: Vector2d | number, y?: number) {\n\t\tlet _x: number;\n\t\tlet _y: number;\n\n\t\tif (xOrVector instanceof Vector2d) {\n\t\t\t_x = xOrVector.x;\n\t\t\t_y = xOrVector.y;\n\t\t} else {\n\t\t\t_x = xOrVector;\n\t\t\t_y = y!;\n\t\t}\n\n\t\t// check whether point is outside the bounding box\n\t\tif (\n\t\t\t_x < this.left ||\n\t\t\t_x >= this.right ||\n\t\t\t_y < this.top ||\n\t\t\t_y >= this.bottom\n\t\t) {\n\t\t\treturn false; // outside bounding box\n\t\t}\n\n\t\t// check whether point is within the bounding box minus radius\n\t\tif (\n\t\t\t(_x >= this.left + this.radius && _x <= this.right - this.radius) ||\n\t\t\t(_y >= this.top + this.radius && _y <= this.bottom - this.radius)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// check whether point is in one of the rounded corner areas\n\t\tlet tx;\n\t\tlet ty;\n\t\tconst radiusX = Math.max(0, Math.min(this.radius, this.width / 2));\n\t\tconst radiusY = Math.max(0, Math.min(this.radius, this.height / 2));\n\n\t\tif (_x < this.left + radiusX && _y < this.top + radiusY) {\n\t\t\ttx = _x - this.left - radiusX;\n\t\t\tty = _y - this.top - radiusY;\n\t\t} else if (_x > this.right - radiusX && _y < this.top + radiusY) {\n\t\t\ttx = _x - this.right + radiusX;\n\t\t\tty = _y - this.top - radiusY;\n\t\t} else if (_x > this.right - radiusX && _y > this.bottom - radiusY) {\n\t\t\ttx = _x - this.right + radiusX;\n\t\t\tty = _y - this.bottom + radiusY;\n\t\t} else if (_x < this.left + radiusX && _y > this.bottom - radiusY) {\n\t\t\ttx = _x - this.left - radiusX;\n\t\t\tty = _y - this.bottom + radiusY;\n\t\t} else {\n\t\t\treturn false; // inside and not within the rounded corner area\n\t\t}\n\n\t\t// Pythagorean theorem.\n\t\treturn tx * tx + ty * ty <= radiusX * radiusY;\n\t}\n\n\t/**\n\t * check if this RoundRect is identical to the specified one\n\t * @param rrect - Other rounded rectangle.\n\t * @returns true if equals\n\t */\n\toverride equals(rrect: RoundRect) {\n\t\treturn super.equals(rrect) && this.radius === rrect.radius;\n\t}\n\n\t/**\n\t * clone this RoundRect\n\t * @returns new RoundRect\n\t */\n\toverride clone() {\n\t\treturn new RoundRect(\n\t\t\tthis.pos.x,\n\t\t\tthis.pos.y,\n\t\t\tthis.width,\n\t\t\tthis.height,\n\t\t\tthis.radius,\n\t\t);\n\t}\n}\n\nexport const roundedRectanglePool = createPool<\n\tRoundRect,\n\t[\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tradius?: number | undefined,\n\t]\n>((x, y, width, height, radius) => {\n\tconst roundedRectangle = new RoundRect(x, y, width, height, radius);\n\treturn {\n\t\tinstance: roundedRectangle,\n\t\treset(x, y, width, height, radius = DEFAULT_RADIUS) {\n\t\t\troundedRectangle.pos.set(x, y);\n\t\t\troundedRectangle.setSize(width, height);\n\t\t\troundedRectangle.radius = radius;\n\t\t},\n\t};\n});\n", "const LOG2_PAGE_SIZE = 9;\nconst PAGE_SIZE = 1 << LOG2_PAGE_SIZE;\n\n/**\n * a glyph representing a single character in a font\n * @ignore\n */\nexport default class Glyph {\n\t/**\n\t * @ignore\n\t */\n\tid: number;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\tu: number;\n\tv: number;\n\tu2: number;\n\tv2: number;\n\txoffset: number;\n\tyoffset: number;\n\txadvance: number;\n\tfixedWidth: boolean;\n\tkerning: { [key: number]: { [key: number]: number } };\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor() {\n\t\tthis.id = 0;\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.u = 0;\n\t\tthis.v = 0;\n\t\tthis.u2 = 0;\n\t\tthis.v2 = 0;\n\t\tthis.xoffset = 0;\n\t\tthis.yoffset = 0;\n\t\tthis.xadvance = 0;\n\t\tthis.fixedWidth = false;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tgetKerning(ch: number): number {\n\t\tif (this.kerning) {\n\t\t\tconst page = this.kerning[ch >>> LOG2_PAGE_SIZE];\n\t\t\tif (page) {\n\t\t\t\treturn page[ch & (PAGE_SIZE - 1)] || 0;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tsetKerning(ch: number, value: number): void {\n\t\tif (!this.kerning) {\n\t\t\tthis.kerning = {};\n\t\t}\n\t\tlet page = this.kerning[ch >>> LOG2_PAGE_SIZE];\n\t\tif (typeof page === \"undefined\") {\n\t\t\tthis.kerning[ch >>> LOG2_PAGE_SIZE] = {};\n\t\t\tpage = this.kerning[ch >>> LOG2_PAGE_SIZE];\n\t\t}\n\t\tpage[ch & (PAGE_SIZE - 1)] = value;\n\t}\n}\n", "import { createPool } from \"../../pool.ts\";\nimport Glyph from \"./glyph.ts\";\n\n// bitmap constants\nconst capChars: string[] = [\n\t\"M\",\n\t\"N\",\n\t\"B\",\n\t\"D\",\n\t\"C\",\n\t\"E\",\n\t\"F\",\n\t\"K\",\n\t\"A\",\n\t\"G\",\n\t\"H\",\n\t\"I\",\n\t\"J\",\n\t\"L\",\n\t\"O\",\n\t\"P\",\n\t\"Q\",\n\t\"R\",\n\t\"S\",\n\t\"T\",\n\t\"U\",\n\t\"V\",\n\t\"W\",\n\t\"X\",\n\t\"Y\",\n\t\"Z\",\n];\n\n/**\n * Gets the value from a string of pairs.\n * @ignore\n */\nfunction getValueFromPair(string: string, pattern: RegExp): string {\n\tconst value = string.match(pattern);\n\tif (!value) {\n\t\tthrow new Error(\n\t\t\t`${`Could not find pattern ${pattern}` as string} in string: ${string}`,\n\t\t);\n\t}\n\n\treturn value[0].split(\"=\")[1];\n}\n\n/**\n * Gets the first glyph in the map that is not a space character\n * @ignore\n * @param glyphs - the map of glyphs, each key is a char code\n * @returns the first glyph that is not a space character\n */\nfunction getFirstGlyph(glyphs: any): Glyph | null {\n\tconst keys = Object.keys(glyphs);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tif (parseInt(keys[i]) > 32) {\n\t\t\treturn glyphs[keys[i]];\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Creates a glyph to use for the space character\n * @ignore\n * @param glyphs - the map of glyphs, each key is a char code\n */\nfunction createSpaceGlyph(glyphs: any) {\n\tconst spaceCharCode = \" \".charCodeAt(0);\n\tlet glyph = glyphs[spaceCharCode];\n\tif (!glyph) {\n\t\tglyph = new Glyph();\n\t\tglyph.id = spaceCharCode;\n\t\tconst firstGlyph = getFirstGlyph(glyphs);\n\t\tglyph.xadvance = firstGlyph !== null ? firstGlyph.xadvance : 0;\n\t\tglyphs[spaceCharCode] = glyph;\n\t}\n}\n\nexport default class BitmapTextData {\n\tpadTop: number = 0;\n\tpadRight: number = 0;\n\tpadBottom: number = 0;\n\tpadLeft: number = 0;\n\tlineHeight: number = 0;\n\tcapHeight: number = 1;\n\tdescent: number = 0;\n\tglyphs: { [key: number]: Glyph } = {};\n\n\tconstructor(data: string) {\n\t\tthis.parse(data);\n\t}\n\n\tparse(fontData: string) {\n\t\tif (!fontData) {\n\t\t\tthrow new Error(\n\t\t\t\t\"File containing font data was empty, cannot load the bitmap font.\",\n\t\t\t);\n\t\t}\n\n\t\tconst lines = fontData.split(/\\r\\n|\\n/);\n\t\tconst padding = fontData.match(/padding=\\d+,\\d+,\\d+,\\d+/g);\n\t\tif (!padding) {\n\t\t\tthrow new Error(\"Padding not found in first line\");\n\t\t}\n\t\tconst paddingValues = padding[0].split(\"=\")[1].split(\",\");\n\n\t\tthis.padTop = parseFloat(paddingValues[0]);\n\t\tthis.padLeft = parseFloat(paddingValues[1]);\n\t\tthis.padBottom = parseFloat(paddingValues[2]);\n\t\tthis.padRight = parseFloat(paddingValues[3]);\n\t\tthis.lineHeight = parseFloat(getValueFromPair(lines[1], /lineHeight=\\d+/g));\n\n\t\tthis.capHeight = 1;\n\t\tthis.descent = 0;\n\t\tthis.glyphs = {};\n\n\t\tconst baseLine = parseFloat(getValueFromPair(lines[1], /base=\\d+/g));\n\t\tconst padY = this.padTop + this.padBottom;\n\n\t\tlet glyph: Glyph | null = null;\n\n\t\tfor (let i = 4; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tconst characterValues = line.split(/=|\\s+/);\n\t\t\tif (!line || /^kernings/.test(line)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (/^kerning\\s/.test(line)) {\n\t\t\t\tconst first = parseFloat(characterValues[2]);\n\t\t\t\tconst second = parseFloat(characterValues[4]);\n\t\t\t\tconst amount = parseFloat(characterValues[6]);\n\n\t\t\t\tglyph = this.glyphs[first];\n\t\t\t\tif (glyph !== null && typeof glyph !== \"undefined\") {\n\t\t\t\t\tglyph.setKerning(second, amount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tglyph = new Glyph();\n\n\t\t\t\tconst ch = parseFloat(characterValues[2]);\n\t\t\t\tglyph.id = ch;\n\t\t\t\tglyph.x = parseFloat(characterValues[4]);\n\t\t\t\tglyph.y = parseFloat(characterValues[6]);\n\t\t\t\tglyph.width = parseFloat(characterValues[8]);\n\t\t\t\tglyph.height = parseFloat(characterValues[10]);\n\t\t\t\tglyph.xoffset = parseFloat(characterValues[12]);\n\t\t\t\tglyph.yoffset = parseFloat(characterValues[14]);\n\t\t\t\tglyph.xadvance = parseFloat(characterValues[16]);\n\n\t\t\t\tif (glyph.width > 0 && glyph.height > 0) {\n\t\t\t\t\tthis.descent = Math.min(baseLine + glyph.yoffset, this.descent);\n\t\t\t\t}\n\n\t\t\t\tthis.glyphs[ch] = glyph;\n\t\t\t}\n\t\t}\n\n\t\tthis.descent += this.padBottom;\n\n\t\tcreateSpaceGlyph(this.glyphs);\n\n\t\tlet capGlyph: Glyph | null = null;\n\t\tfor (let i = 0; i < capChars.length; i++) {\n\t\t\tconst capChar = capChars[i];\n\t\t\tcapGlyph = this.glyphs[capChar.charCodeAt(0)];\n\t\t\tif (capGlyph) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!capGlyph) {\n\t\t\tfor (const charCode in this.glyphs) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(this.glyphs, charCode)) {\n\t\t\t\t\tglyph = this.glyphs[charCode];\n\t\t\t\t\tif (glyph.height === 0 || glyph.width === 0) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthis.capHeight = Math.max(this.capHeight, glyph.height);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.capHeight = capGlyph.height;\n\t\t}\n\t\tthis.capHeight -= padY;\n\t}\n}\n\nexport const bitmapTextDataPool = createPool<\n\tBitmapTextData,\n\t[fontData: string]\n>((fontData: string) => {\n\tconst instance = new BitmapTextData(fontData);\n\n\treturn {\n\t\tinstance,\n\t\treset(fontData) {\n\t\t\tinstance.parse(fontData);\n\t\t},\n\t};\n});\n", "/*\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n */\n\n/**\n * Easing Function :<br>\n * <p>\n * Easing.Linear.None<br>\n * Easing.Quadratic.In<br>\n * Easing.Quadratic.Out<br>\n * Easing.Quadratic.InOut<br>\n * Easing.Cubic.In<br>\n * Easing.Cubic.Out<br>\n * Easing.Cubic.InOut<br>\n * Easing.Quartic.In<br>\n * Easing.Quartic.Out<br>\n * Easing.Quartic.InOut<br>\n * Easing.Quintic.In<br>\n * Easing.Quintic.Out<br>\n * Easing.Quintic.InOut<br>\n * Easing.Sinusoidal.In<br>\n * Easing.Sinusoidal.Out<br>\n * Easing.Sinusoidal.InOut<br>\n * Easing.Exponential.In<br>\n * Easing.Exponential.Out<br>\n * Easing.Exponential.InOut<br>\n * Easing.Circular.In<br>\n * Easing.Circular.Out<br>\n * Easing.Circular.InOut<br>\n * Easing.Elastic.In<br>\n * Easing.Elastic.Out<br>\n * Easing.Elastic.InOut<br>\n * Easing.Back.In<br>\n * Easing.Back.Out<br>\n * Easing.Back.InOut<br>\n * Easing.Bounce.In<br>\n * Easing.Bounce.Out<br>\n * Easing.Bounce.InOut\n * </p>\n */\n\nexport type EasingFunction = (t: number) => number;\n\nexport const Easing = {\n\tLinear: {\n\t\tNone: (k: number) => {\n\t\t\treturn k;\n\t\t},\n\t},\n\n\tQuadratic: {\n\t\tIn: (k: number) => {\n\t\t\treturn k * k;\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn k * (2 - k);\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * k * k;\n\t\t\t}\n\t\t\treturn -0.5 * (--k * (k - 2) - 1);\n\t\t},\n\t},\n\n\tCubic: {\n\t\tIn: (k: number) => {\n\t\t\treturn k * k * k;\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn --k * k * k + 1;\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * k * k * k;\n\t\t\t}\n\t\t\treturn 0.5 * ((k -= 2) * k * k + 2);\n\t\t},\n\t},\n\n\tQuartic: {\n\t\tIn: (k: number) => {\n\t\t\treturn k * k * k * k;\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn 1 - --k * k * k * k;\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * k * k * k * k;\n\t\t\t}\n\t\t\treturn -0.5 * ((k -= 2) * k * k * k - 2);\n\t\t},\n\t},\n\n\tQuintic: {\n\t\tIn: (k: number) => {\n\t\t\treturn k * k * k * k * k;\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn --k * k * k * k * k + 1;\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * k * k * k * k * k;\n\t\t\t}\n\t\t\treturn 0.5 * ((k -= 2) * k * k * k * k + 2);\n\t\t},\n\t},\n\n\tSinusoidal: {\n\t\tIn: (k: number) => {\n\t\t\treturn 1 - Math.cos((k * Math.PI) / 2);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn Math.sin((k * Math.PI) / 2);\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\treturn 0.5 * (1 - Math.cos(Math.PI * k));\n\t\t},\n\t},\n\n\tExponential: {\n\t\tIn: (k: number) => {\n\t\t\treturn k === 0 ? 0 : Math.pow(1024, k - 1);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif (k === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (k === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * Math.pow(1024, k - 1);\n\t\t\t}\n\t\t\treturn 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);\n\t\t},\n\t},\n\n\tCircular: {\n\t\tIn: (k: number) => {\n\t\t\treturn 1 - Math.sqrt(1 - k * k);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\treturn Math.sqrt(1 - --k * k);\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn -0.5 * (Math.sqrt(1 - k * k) - 1);\n\t\t\t}\n\t\t\treturn 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);\n\t\t},\n\t},\n\n\tElastic: {\n\t\tIn: (k: number) => {\n\t\t\tif (k === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (k === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn -Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\tif (k === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (k === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn Math.pow(2, -10 * k) * Math.sin((k - 0.1) * 5 * Math.PI) + 1;\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif (k === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (k === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tk *= 2;\n\t\t\tif (k < 1) {\n\t\t\t\treturn (\n\t\t\t\t\t-0.5 * Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t0.5 * Math.pow(2, -10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI) + 1\n\t\t\t);\n\t\t},\n\t},\n\n\tBack: {\n\t\tIn: (k: number) => {\n\t\t\tconst s = 1.70158;\n\t\t\treturn k * k * ((s + 1) * k - s);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\tconst s = 1.70158;\n\t\t\treturn --k * k * ((s + 1) * k + s) + 1;\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tconst s = 1.70158 * 1.525;\n\t\t\tif ((k *= 2) < 1) {\n\t\t\t\treturn 0.5 * (k * k * ((s + 1) * k - s));\n\t\t\t}\n\t\t\treturn 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);\n\t\t},\n\t},\n\n\tBounce: {\n\t\tIn: (k: number) => {\n\t\t\treturn 1 - Easing.Bounce.Out(1 - k);\n\t\t},\n\t\tOut: (k: number) => {\n\t\t\tif (k < 1 / 2.75) {\n\t\t\t\treturn 7.5625 * k * k;\n\t\t\t} else if (k < 2 / 2.75) {\n\t\t\t\treturn 7.5625 * (k -= 1.5 / 2.75) * k + 0.75;\n\t\t\t} else if (k < 2.5 / 2.75) {\n\t\t\t\treturn 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375;\n\t\t\t} else {\n\t\t\t\treturn 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375;\n\t\t\t}\n\t\t},\n\t\tInOut: (k: number) => {\n\t\t\tif (k < 0.5) {\n\t\t\t\treturn Easing.Bounce.In(k * 2) * 0.5;\n\t\t\t}\n\t\t\treturn Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5;\n\t\t},\n\t},\n};\n", "/*\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n */\n\nconst linear = (p0: number, p1: number, t: number) => {\n\treturn (p1 - p0) * t + p0;\n};\n\nconst factorialCache = [1];\n\nconst factorial = (n: number) => {\n\tif (factorialCache[n]) {\n\t\treturn factorialCache[n];\n\t}\n\tlet s = 1;\n\tfor (let i = n; i > 1; i--) {\n\t\ts *= i;\n\t}\n\tfactorialCache[n] = s;\n\treturn s;\n};\n\nconst bernstein = (n: number, i: number) => {\n\treturn factorial(n) / factorial(i) / factorial(n - i);\n};\n\nconst catmullRom = (\n\tp0: number,\n\tp1: number,\n\tp2: number,\n\tp3: number,\n\tt: number,\n) => {\n\tconst v0 = (p2 - p0) * 0.5;\n\tconst v1 = (p3 - p1) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn (\n\t\t(2 * p1 - 2 * p2 + v0 + v1) * t3 +\n\t\t(-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 +\n\t\tv0 * t +\n\t\tp1\n\t);\n};\n\nexport type InterpolationFunction = (v: number[], k: number) => number;\n\nexport const Interpolation = {\n\tLinear: (v: number[], k: number) => {\n\t\tconst m = v.length - 1;\n\t\tconst f = m * k;\n\t\tconst i = Math.floor(f);\n\n\t\tif (k < 0) {\n\t\t\treturn linear(v[0], v[1], f);\n\t\t}\n\t\tif (k > 1) {\n\t\t\treturn linear(v[m], v[m - 1], m - f);\n\t\t}\n\n\t\treturn linear(v[i], v[i + 1 > m ? m : i + 1], f - i);\n\t},\n\tBezier: (v: number[], k: number) => {\n\t\tlet b = 0;\n\t\tconst n = v.length - 1;\n\n\t\tfor (let i = 0; i <= n; i++) {\n\t\t\tb += Math.pow(1 - k, n - i) * Math.pow(k, i) * v[i] * bernstein(n, i);\n\t\t}\n\n\t\treturn b;\n\t},\n\tCatmullRom: (v: number[], k: number) => {\n\t\tconst m = v.length - 1;\n\t\tlet f = m * k;\n\t\tlet i = Math.floor(f);\n\n\t\tif (v[0] === v[m]) {\n\t\t\tif (k < 0) {\n\t\t\t\ti = Math.floor((f = m * (1 + k)));\n\t\t\t}\n\n\t\t\treturn catmullRom(\n\t\t\t\tv[(i - 1 + m) % m],\n\t\t\t\tv[i],\n\t\t\t\tv[(i + 1) % m],\n\t\t\t\tv[(i + 2) % m],\n\t\t\t\tf - i,\n\t\t\t);\n\t\t} else {\n\t\t\tif (k < 0) {\n\t\t\t\treturn v[0] - (catmullRom(v[0], v[0], v[1], v[1], -f) - v[0]);\n\t\t\t}\n\t\t\tif (k > 1) {\n\t\t\t\treturn (\n\t\t\t\t\tv[m] - (catmullRom(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m])\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn catmullRom(\n\t\t\t\tv[i ? i - 1 : 0],\n\t\t\t\tv[i],\n\t\t\t\tv[m < i + 1 ? m : i + 1],\n\t\t\t\tv[m < i + 2 ? m : i + 2],\n\t\t\t\tf - i,\n\t\t\t);\n\t\t}\n\t},\n};\n", "import { game } from \"../index.js\";\nimport { eventEmitter, STATE_RESUME } from \"../system/event.js\";\nimport { createPool } from \"../system/pool.ts\";\nimport timer from \"../system/timer.js\";\nimport { Easing, EasingFunction } from \"./easing.js\";\nimport { Interpolation, InterpolationFunction } from \"./interpolation.js\";\n\n/*\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n */\n\n/** @ignore */\ntype OnStartCallback<T> = (this: T) => void;\n/** @ignore */\ntype OnUpdateCallback<T> = (this: T, value: number) => void;\n/** @ignore */\ntype OnCompleteCallback<T> = (this: T) => void;\n\n/**\n * Javascript Tweening Engine<p>\n * Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equation<p>\n * <a href=\"https://github.com/sole/Tween.js\">https://github.com/sole/Tween.js</a><p>\n * author sole / http://soledadpenades.com<br>\n * author mr.doob / http://mrdoob.com<br>\n * author Robert Eisele / http://www.xarg.org<br>\n * author Philippe / http://philippe.elsass.me<br>\n * author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html<br>\n * author Paul Lewis / http://www.aerotwist.com/<br>\n * author lechecacharro<br>\n * author Josh Faul / http://jocafa.com/\n */\nexport default class Tween {\n\t_object: object;\n\t_valuesStart: Record<string, unknown>;\n\t_valuesEnd: Record<string, unknown>;\n\t_valuesStartRepeat: Record<string, unknown>;\n\t_duration: number;\n\t_repeat: number;\n\t_yoyo: boolean;\n\t_reversed: boolean;\n\t_delayTime: number;\n\t_startTime: number | null;\n\t_easingFunction: EasingFunction;\n\t_interpolationFunction: InterpolationFunction;\n\t_chainedTweens: Array<Tween>;\n\t_onStartCallback: OnStartCallback<object> | null;\n\t_onStartCallbackFired: boolean;\n\t_onUpdateCallback: OnUpdateCallback<object> | null;\n\t_onCompleteCallback: OnCompleteCallback<object> | null;\n\t_tweenTimeTracker: number;\n\tisPersistent: boolean;\n\tupdateWhenPaused: boolean;\n\tisRenderable: boolean;\n\n\t#boundResumeCallback: (elapsed: number) => void;\n\n\t/**\n\t * @param object - object on which to apply the tween\n\t * @example\n\t * // add a tween to change the object pos.x and pos.y variable to 200 in 3 seconds\n\t * tween = new me.Tween(myObject.pos).to({\n\t * x: 200,\n\t * y: 200,\n\t * }, {\n\t * duration: 3000,\n\t * easing: me.Tween.Easing.Bounce.Out,\n\t * autoStart : true\n\t * }).onComplete(myFunc);\n\t */\n\tconstructor(object: object) {\n\t\tthis.setProperties(object);\n\n\t\tthis.#boundResumeCallback = this._resumeCallback.bind(this);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonResetEvent(object: object) {\n\t\tthis.setProperties(object);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tsetProperties(object: object) {\n\t\tthis._object = object;\n\t\tthis._valuesStart = {};\n\t\tthis._valuesEnd = {};\n\t\tthis._valuesStartRepeat = {};\n\t\tthis._duration = 1000;\n\t\tthis._repeat = 0;\n\t\tthis._yoyo = false;\n\t\tthis._reversed = false;\n\t\tthis._delayTime = 0;\n\t\tthis._startTime = null;\n\t\tthis._easingFunction = Easing.Linear.None;\n\t\tthis._interpolationFunction = Interpolation.Linear;\n\t\tthis._chainedTweens = [];\n\t\tthis._onStartCallback = null;\n\t\tthis._onStartCallbackFired = false;\n\t\tthis._onUpdateCallback = null;\n\t\tthis._onCompleteCallback = null;\n\t\t// tweens are synchronized with the game update loop\n\t\tthis._tweenTimeTracker = game.lastUpdate;\n\n\t\t// reset flags to default value\n\t\tthis.isPersistent = false;\n\t\t// this is not really supported\n\t\tthis.updateWhenPaused = false;\n\t\t// comply with the container contract\n\t\tthis.isRenderable = false;\n\n\t\t// Set all starting values present on the target object\n\t\tfor (const field in object) {\n\t\t\tif (typeof object !== \"object\") {\n\t\t\t\tthis._valuesStart[field] = parseFloat(object[field]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t_resumeCallback(elapsed: number) {\n\t\tif (this._startTime) {\n\t\t\tthis._startTime += elapsed;\n\t\t}\n\t}\n\n\t/**\n\t * subscribe to the resume event when added\n\t * @ignore\n\t */\n\tonActivateEvent() {\n\t\teventEmitter.addListener(STATE_RESUME, this.#boundResumeCallback);\n\t}\n\n\t/**\n\t * Unsubscribe when tween is removed\n\t * @ignore\n\t */\n\tonDeactivateEvent() {\n\t\teventEmitter.removeListener(STATE_RESUME, this.#boundResumeCallback);\n\t}\n\n\t/**\n\t * object properties to be updated and duration\n\t * @param properties - hash of properties\n\t * @param [options] - object of tween properties, or a duration if a numeric value is passed\n\t * @param [options.duration] - tween duration\n\t * @param [options.easing] - easing function\n\t * @param [options.delay] - delay amount expressed in milliseconds\n\t * @param [options.yoyo] - allows the tween to bounce back to their original value when finished. To be used together with repeat to create endless loops.\n\t * @param [options.repeat] - amount of times the tween should be repeated\n\t * @param [options.interpolation] - interpolation function\n\t * @param [options.autoStart] - allow this tween to start automatically. Otherwise call me.Tween.start().\n\t * @returns this instance for object chaining\n\t */\n\tto(\n\t\tproperties: Record<string, unknown>,\n\t\toptions?: {\n\t\t\tduration?: number | undefined;\n\t\t\teasing?: EasingFunction | undefined;\n\t\t\tyoyo?: boolean | undefined;\n\t\t\trepeat?: number | undefined;\n\t\t\tdelay?: number | undefined;\n\t\t\tinterpolation?: InterpolationFunction | undefined;\n\t\t\tautoStart?: boolean | undefined;\n\t\t},\n\t) {\n\t\tthis._valuesEnd = properties;\n\n\t\tif (typeof options !== \"undefined\") {\n\t\t\tif (options.duration) {\n\t\t\t\tthis._duration = options.duration;\n\t\t\t}\n\t\t\tif (options.yoyo) {\n\t\t\t\tthis.yoyo(options.yoyo);\n\t\t\t}\n\t\t\tif (options.easing) {\n\t\t\t\tthis.easing(options.easing);\n\t\t\t}\n\t\t\tif (options.repeat) {\n\t\t\t\tthis.repeat(options.repeat);\n\t\t\t}\n\t\t\tif (options.delay) {\n\t\t\t\tthis.delay(options.delay);\n\t\t\t}\n\t\t\tif (options.interpolation) {\n\t\t\t\tthis.interpolation(options.interpolation);\n\t\t\t}\n\t\t\tif (options.autoStart) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * start the tween\n\t * @param [time] - the current time when the tween was started\n\t * @returns this instance for object chaining\n\t */\n\tstart(time = timer.getTime()) {\n\t\tthis._onStartCallbackFired = false;\n\n\t\t// add the tween to the object pool on start\n\t\tgame.world.addChild(this);\n\n\t\tthis._startTime = time + this._delayTime;\n\n\t\tfor (const property in this._valuesEnd) {\n\t\t\tconst endValue = this._valuesEnd[property];\n\t\t\t// check if an Array was provided as property value\n\t\t\tif (Array.isArray(endValue)) {\n\t\t\t\tif (endValue.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// create a local copy of the Array with the start value at the front\n\t\t\t\tthis._valuesEnd[property] = [\n\t\t\t\t\t(this._object as Record<string, unknown>)[property],\n\t\t\t\t].concat(endValue);\n\t\t\t}\n\n\t\t\tthis._valuesStart[property] = (this._object as Record<string, unknown>)[\n\t\t\t\tproperty\n\t\t\t];\n\n\t\t\tif (!Array.isArray(this._valuesStart[property])) {\n\t\t\t\t(this._valuesStart[property] as number) *= 1.0; // Ensures we're using numbers, not strings\n\t\t\t}\n\n\t\t\tthis._valuesStartRepeat[property] = this._valuesStart[property] || 0;\n\t\t}\n\n\t\treturn this;\n\t}\n\t/**\n\t * stop the tween\n\t * @returns this instance for object chaining\n\t */\n\tstop() {\n\t\t// remove the tween from the world container\n\t\tgame.world.removeChildNow(this);\n\t\treturn this;\n\t}\n\n\t/**\n\t * delay the tween\n\t * @param amount - delay amount expressed in milliseconds\n\t * @returns this instance for object chaining\n\t */\n\tdelay(amount: number) {\n\t\tthis._delayTime = amount;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Repeat the tween\n\t * @param times - amount of times the tween should be repeated\n\t * @returns this instance for object chaining\n\t */\n\trepeat(times: number) {\n\t\tthis._repeat = times;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Allows the tween to bounce back to their original value when finished.\n\t * To be used together with repeat to create endless loops.\n\t * @param yoyo flag\n\t * @returns this instance for object chaining\n\t */\n\tyoyo(yoyo: boolean) {\n\t\tthis._yoyo = yoyo;\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the easing function\n\t * @param easing - easing function\n\t * @returns this instance for object chaining\n\t */\n\teasing(easing: EasingFunction) {\n\t\tthis._easingFunction = easing;\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the interpolation function\n\t * @param interpolation - interpolation function\n\t * @returns this instance for object chaining\n\t */\n\tinterpolation(interpolation: InterpolationFunction) {\n\t\tthis._interpolationFunction = interpolation;\n\t\treturn this;\n\t}\n\n\t/**\n\t * chain the tween\n\t * @param tweens - Tween(s) to be chained\n\t * @returns this instance for object chaining\n\t */\n\tchain(...tweens: Tween[]) {\n\t\tthis._chainedTweens = tweens;\n\t\treturn this;\n\t}\n\n\t/**\n\t * onStart callback\n\t * @param onStartCallback - callback\n\t * @returns this instance for object chaining\n\t */\n\tonStart(onStartCallback: OnStartCallback<object>) {\n\t\tthis._onStartCallback = onStartCallback;\n\t\treturn this;\n\t}\n\n\t/**\n\t * onUpdate callback\n\t * @param onUpdateCallback - callback\n\t * @returns this instance for object chaining\n\t */\n\tonUpdate(onUpdateCallback: OnUpdateCallback<object>) {\n\t\tthis._onUpdateCallback = onUpdateCallback;\n\t\treturn this;\n\t}\n\n\t/**\n\t * onComplete callback\n\t * @param onCompleteCallback - callback\n\t * @returns this instance for object chaining\n\t */\n\tonComplete(onCompleteCallback: OnCompleteCallback<object>) {\n\t\tthis._onCompleteCallback = onCompleteCallback;\n\t\treturn this;\n\t}\n\n\t/** @ignore */\n\tupdate(dt: number) {\n\t\t// the original Tween implementation expect\n\t\t// a timestamp and not a time delta\n\t\tthis._tweenTimeTracker =\n\t\t\tgame.lastUpdate > this._tweenTimeTracker\n\t\t\t\t? game.lastUpdate\n\t\t\t\t: this._tweenTimeTracker + dt;\n\t\tconst time = this._tweenTimeTracker;\n\n\t\tif (this._startTime === null || time < this._startTime) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!this._onStartCallbackFired) {\n\t\t\tif (this._onStartCallback !== null) {\n\t\t\t\tthis._onStartCallback.call(this._object);\n\t\t\t}\n\n\t\t\tthis._onStartCallbackFired = true;\n\t\t}\n\n\t\tlet elapsed = (time - this._startTime) / this._duration;\n\t\telapsed = elapsed > 1 ? 1 : elapsed;\n\n\t\tconst value = this._easingFunction(elapsed);\n\n\t\tfor (const property in this._valuesEnd) {\n\t\t\tconst start = this._valuesStart[property] || 0;\n\t\t\tlet end = this._valuesEnd[property];\n\n\t\t\tif (Array.isArray(end)) {\n\t\t\t\t// @ts-expect-error todo\n\t\t\t\tthis._object[property] = this._interpolationFunction(end, value);\n\t\t\t} else {\n\t\t\t\t// Parses relative end values with start as base (e.g.: +10, -3)\n\t\t\t\tif (typeof end === \"string\") {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\tend = start + parseFloat(end);\n\t\t\t\t}\n\n\t\t\t\t// protect against non numeric properties.\n\t\t\t\tif (typeof end === \"number\") {\n\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\tthis._object[property] = start + (end - start) * value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._onUpdateCallback !== null) {\n\t\t\tthis._onUpdateCallback.call(this._object, value);\n\t\t}\n\n\t\tif (elapsed === 1) {\n\t\t\tif (this._repeat > 0) {\n\t\t\t\tif (isFinite(this._repeat)) {\n\t\t\t\t\tthis._repeat--;\n\t\t\t\t}\n\n\t\t\t\t// reassign starting values, restart by making startTime = now\n\t\t\t\tfor (const property in this._valuesStartRepeat) {\n\t\t\t\t\tif (typeof this._valuesEnd[property] === \"string\") {\n\t\t\t\t\t\tthis._valuesStartRepeat[property] =\n\t\t\t\t\t\t\t// @ts-expect-error todo\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\t\t\tthis._valuesStartRepeat[property] +\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tparseFloat(this._valuesEnd[property]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._yoyo) {\n\t\t\t\t\t\tconst tmp = this._valuesStartRepeat[property];\n\t\t\t\t\t\tthis._valuesStartRepeat[property] = this._valuesEnd[property];\n\t\t\t\t\t\tthis._valuesEnd[property] = tmp;\n\t\t\t\t\t}\n\t\t\t\t\tthis._valuesStart[property] = this._valuesStartRepeat[property];\n\t\t\t\t}\n\n\t\t\t\tif (this._yoyo) {\n\t\t\t\t\tthis._reversed = !this._reversed;\n\t\t\t\t}\n\n\t\t\t\tthis._startTime = time + this._delayTime;\n\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\t// remove the tween from the world container\n\t\t\t\tgame.world.removeChildNow(this);\n\n\t\t\t\tif (this._onCompleteCallback !== null) {\n\t\t\t\t\tthis._onCompleteCallback.call(this._object);\n\t\t\t\t}\n\n\t\t\t\tfor (\n\t\t\t\t\tlet i = 0, numChainedTweens = this._chainedTweens.length;\n\t\t\t\t\ti < numChainedTweens;\n\t\t\t\t\ti++\n\t\t\t\t) {\n\t\t\t\t\tthis._chainedTweens[i].start(time);\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// export easing function as static class property\n\tstatic get Easing() {\n\t\treturn Easing;\n\t}\n\tstatic get Interpolation() {\n\t\treturn Interpolation;\n\t}\n}\n\nexport const tweenPool = createPool((obj: object) => {\n\tconst tween = new Tween(obj);\n\n\treturn {\n\t\tinstance: tween,\n\t\treset(obj: object) {\n\t\t\ttween.setProperties(obj);\n\t\t},\n\t};\n});\n", "import { ellipsePool } from \"./geometries/ellipse\";\nimport { linePool } from \"./geometries/line\";\nimport { pointPool } from \"./geometries/point\";\nimport { polygonPool } from \"./geometries/polygon\";\nimport { rectPool } from \"./geometries/rectangle\";\nimport { roundedRectanglePool } from \"./geometries/roundrect\";\nimport { colorPool } from \"./math/color\";\nimport { matrix2dPool } from \"./math/matrix2d\";\nimport { matrix3dPool } from \"./math/matrix3d\";\nimport { vector2dPool } from \"./math/vector2d\";\nimport { vector3dPool } from \"./math/vector3d\";\nimport type ParticleEmitter from \"./particles/emitter\";\nimport type Particle from \"./particles/particle\";\nimport { boundsPool } from \"./physics/bounds\";\nimport { bitmapTextDataPool } from \"./renderable/text/bitmaptextdata\";\nimport type { Pool } from \"./system/pool\";\nimport { getRegisteredPools, registerPool } from \"./system/pool\";\nimport { tweenPool } from \"./tweens/tween\";\n\n// Register all pools that don't have circular dependency issues\nregisterPool(\"vector2d\", vector2dPool);\nregisterPool(\"vector3d\", vector3dPool);\nregisterPool(\"point\", pointPool);\nregisterPool(\"matrix2d\", matrix2dPool);\nregisterPool(\"matrix3d\", matrix3dPool);\nregisterPool(\"bounds\", boundsPool);\nregisterPool(\"color\", colorPool);\nregisterPool(\"polygon\", polygonPool);\nregisterPool(\"line\", linePool);\nregisterPool(\"rectangle\", rectPool);\nregisterPool(\"roundedRectangle\", roundedRectanglePool);\nregisterPool(\"ellipse\", ellipsePool);\nregisterPool(\"tween\", tweenPool);\nregisterPool(\"bitmapTextData\", bitmapTextDataPool);\n// Note: particlePool registers itself in particles/particle.ts to avoid circular dependencies\n\n// Type map derived from actual pool instances for type-safe getPool()\n// particlePool uses import() type to avoid circular runtime dependency\ninterface PoolMap {\n\tvector2d: typeof vector2dPool;\n\tvector3d: typeof vector3dPool;\n\tpoint: typeof pointPool;\n\tmatrix2d: typeof matrix2dPool;\n\tmatrix3d: typeof matrix3dPool;\n\tbounds: typeof boundsPool;\n\tcolor: typeof colorPool;\n\tpolygon: typeof polygonPool;\n\tline: typeof linePool;\n\trectangle: typeof rectPool;\n\troundedRectangle: typeof roundedRectanglePool;\n\tellipse: typeof ellipsePool;\n\ttween: typeof tweenPool;\n\tparticle: Pool<Particle, [emitter: ParticleEmitter]>;\n\tbitmapTextData: typeof bitmapTextDataPool;\n}\n\ntype PoolKey = keyof PoolMap;\n\nexport const getPool = <K extends PoolKey>(key: K): PoolMap[K] => {\n\treturn getRegisteredPools()[key] as PoolMap[K];\n};\n\nexport const getTotalPoolSize = (): number => {\n\tconst pools = getRegisteredPools();\n\tlet totalSize = 0;\n\tfor (const key in pools) {\n\t\ttotalSize += pools[key].size();\n\t}\n\treturn totalSize;\n};\n\nexport { createPool, registerPool } from \"./system/pool\";\n", "import { getTotalPoolSize } from \"../pool\";\n\n/**\n * Object pooling - a technique that might speed up your game if used properly.<br>\n * If some of your classes will be instantiated and removed a lot at a time, it is a\n * good idea to add the class to this object pool. A separate pool for that class\n * will be created, which will reuse objects of the class. That way they won't be instantiated\n * each time you need a new one (slowing your game), but stored into that pool and taking one\n * already instantiated when you need it.<br><br>\n * This technique is also used by the engine to instantiate objects defined in the map,\n * which means, that on level loading the engine will try to instantiate every object\n * found in the map, based on the user defined name in each Object Properties<br>\n * <img src=\"../images/object_properties.png\"/><br>\n * @see {@link pool} the default global instance of ObjectPool\n */\nclass ObjectPool {\n\tconstructor() {\n\t\tthis.objectClass = {};\n\t\tthis.instance_counter = 0;\n\t}\n\n\t/**\n\t * register an object to the pool. <br>\n\t * Pooling must be set to true if more than one such objects will be created. <br>\n\t * (Note: for an object to be poolable, it must implements a `onResetEvent` method)\n\t * @param {string} className - as defined in the Name field of the Object Properties (in Tiled)\n\t * @param {object} classObj - corresponding Class to be instantiated\n\t * @param {boolean} [recycling=false] - enables object recycling for the specified class\n\t * @example\n\t * // implement CherryEntity\n\t * class Cherry extends Sprite {\n\t * onResetEvent() {\n\t * // reset object mutable properties\n\t * this.lifeBar = 100;\n\t * }\n\t * };\n\t * // add our users defined entities in the object pool and enable object recycling\n\t * me.pool.register(\"cherrysprite\", Cherry, true);\n\t */\n\tregister(className, classObj, recycling = false) {\n\t\tif (typeof classObj !== \"undefined\") {\n\t\t\tthis.objectClass[className] = {\n\t\t\t\tclass: classObj,\n\t\t\t\tpool: recycling ? [] : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot register object '\" + className + \"', invalid class\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Pull a new instance of the requested object (if added into the object pool)\n\t * @param {string} name - as used in {@link pool.register}\n\t * @param {...*} [args] - arguments to be passed when instantiating/reinitializing the object\n\t * @returns {object} the instance of the requested object\n\t * @example\n\t * me.pool.register(\"bullet\", BulletEntity, true);\n\t * me.pool.register(\"enemy\", EnemyEntity, true);\n\t * // ...\n\t * // when we need to manually create a new bullet:\n\t * let bullet = me.pool.pull(\"bullet\", x, y, direction);\n\t * // ...\n\t * // params aren't a fixed number\n\t * // when we need new enemy we can add more params, that the object construct requires:\n\t * let enemy = me.pool.pull(\"enemy\", x, y, direction, speed, power, life);\n\t * // ...\n\t * // when we want to destroy existing object, the remove\n\t * // function will ensure the object can then be reallocated later\n\t * me.game.world.removeChild(enemy);\n\t * me.game.world.removeChild(bullet);\n\t */\n\tpull(name, ...args) {\n\t\tconst className = this.objectClass[name];\n\t\tif (className) {\n\t\t\tconst proto = className[\"class\"];\n\t\t\tconst poolArray = className.pool;\n\t\t\tlet obj;\n\n\t\t\tif (poolArray && (obj = poolArray.pop())) {\n\t\t\t\t// poolable object must implement a `onResetEvent` method\n\t\t\t\tobj.onResetEvent.apply(obj, args);\n\t\t\t\tthis.instance_counter--;\n\t\t\t} else {\n\t\t\t\t// create a new instance\n\t\t\t\tobj = new (proto.bind.apply(proto, [proto, ...args]))();\n\t\t\t\tif (poolArray) {\n\t\t\t\t\tobj.className = name;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\t\tthrow new Error(\"Cannot instantiate object of type '\" + name + \"'\");\n\t}\n\n\t/**\n\t * purge the object pool from any inactive object <br>\n\t * Object pooling must be enabled for this function to work<br>\n\t * note: this will trigger the garbage collector\n\t */\n\tpurge() {\n\t\tfor (const className in this.objectClass) {\n\t\t\tif (this.objectClass[className]) {\n\t\t\t\tthis.objectClass[className].pool = [];\n\t\t\t}\n\t\t}\n\t\tthis.instance_counter = 0;\n\t}\n\n\t/**\n\t * Push back an object instance into the object pool <br>\n\t * Object pooling for the object class must be enabled,\n\t * and object must have been instantiated using {@link pull},\n\t * otherwise this function won't work\n\t * @throws will throw an error if the object cannot be recycled\n\t * @param {object} obj - instance to be recycled\n\t * @param {boolean} [throwOnError=true] - throw an exception if the object cannot be recycled\n\t * @returns {boolean} true if the object was successfully recycled in the object pool\n\t */\n\tpush(obj, throwOnError = true) {\n\t\tif (!this.poolable(obj)) {\n\t\t\tif (throwOnError === true) {\n\t\t\t\tthrow new Error(\"me.pool: object \" + obj + \" cannot be recycled\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// store back the object instance for later recycling\n\t\tthis.objectClass[obj.className].pool.push(obj);\n\t\tthis.instance_counter++;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if an object with the provided name is registered\n\t * @param {string} name - of the registered object class\n\t * @returns {boolean} true if the classname is registered\n\t */\n\texists(name) {\n\t\treturn name in this.objectClass;\n\t}\n\n\t/**\n\t * Check if an object is poolable\n\t * (was properly registered with the recycling feature enable)\n\t * @see register\n\t * @param {object} obj - object to be checked\n\t * @returns {boolean} true if the object is poolable\n\t * @example\n\t * if (!me.pool.poolable(myCherryEntity)) {\n\t * // object was not properly registered\n\t * }\n\t */\n\tpoolable(obj) {\n\t\tconst className = obj.className;\n\t\treturn (\n\t\t\ttypeof className !== \"undefined\" &&\n\t\t\ttypeof obj.onResetEvent === \"function\" &&\n\t\t\tclassName in this.objectClass &&\n\t\t\ttypeof this.objectClass[className].pool !== \"undefined\"\n\t\t);\n\t}\n\n\t/**\n\t * returns the amount of object instance currently in the pool\n\t * @returns {number} amount of object instance\n\t */\n\tgetInstanceCount() {\n\t\treturn this.instance_counter + getTotalPoolSize();\n\t}\n}\n\n/**\n * a default global ObjectPool instance\n * @namespace pool\n * @see ObjectPool\n * @example\n * // register our bullet object into the object pool\n * pool.register(\"bullet\", BulletEntity, true);\n * // ...\n * // when we need to manually create a new bullet:\n * let bullet = pool.pull(\"bullet\", x, y, direction, velocity);\n * // ...\n * // when we want to destroy existing object, the remove\n * // function will ensure the object can then be reallocated later\n * game.world.removeChild(bullet);\n */\nconst pool = new ObjectPool();\n\nexport default pool;\n", "import { game } from \"../index.js\";\n\n/**\n * @import {Line} from \"./../geometries/line.ts\";\n * @import Renderable from \"./../renderable/renderable.js\";\n **/\n\n/**\n * Collision detection (and projection-based collision response) of 2D shapes.<br>\n * Based on the Separating Axis Theorem and supports detecting collisions between simple Axis-Aligned Boxes, convex polygons and circles based shapes.\n * @namespace collision\n */\n\nexport const collision = {\n\t/**\n\t * The maximum number of children that a quadtree node can contain before it is split into sub-nodes.\n\t * @name maxChildren\n\t * @memberof collision\n\t * @public\n\t * @type {number}\n\t * @default 8\n\t * @see game.world.broadphase\n\t */\n\tmaxChildren: 8,\n\n\t/**\n\t * The maximum number of levels that the quadtree will create.\n\t * @name maxDepth\n\t * @memberof collision\n\t * @public\n\t * @type {number}\n\t * @default 4\n\t * @see game.world.broadphase\n\t */\n\tmaxDepth: 4,\n\n\t/**\n\t * Enum for collision type values.\n\t * @property {number} NO_OBJECT to disable collision check\n\t * @property {number} PLAYER_OBJECT playbable characters\n\t * @property {number} NPC_OBJECT non playable characters\n\t * @property {number} ENEMY_OBJECT enemies objects\n\t * @property {number} COLLECTABLE_OBJECT collectable objects\n\t * @property {number} ACTION_OBJECT e.g. doors\n\t * @property {number} PROJECTILE_OBJECT e.g. missiles\n\t * @property {number} WORLD_SHAPE e.g. walls; for map collision shapes\n\t * @property {number} USER user-defined collision types (see example)\n\t * @property {number} ALL_OBJECT all of the above (including user-defined types)\n\t * @readonly\n\t * @enum {number}\n\t * @name types\n\t * @memberof collision\n\t * @see Body.setCollisionMask\n\t * @see Body.collisionType\n\t * @example\n\t * // set the body collision type\n\t * myEntity.body.collisionType = me.collision.types.PLAYER_OBJECT;\n\t *\n\t * // filter collision detection with collision shapes, enemies and collectables\n\t * myEntity.body.setCollisionMask(\n\t * me.collision.types.WORLD_SHAPE |\n\t * me.collision.types.ENEMY_OBJECT |\n\t * me.collision.types.COLLECTABLE_OBJECT\n\t * );\n\t *\n\t * // User-defined collision types are defined using BITWISE LEFT-SHIFT:\n\t * game.collisionTypes = {\n\t * LOCKED_DOOR : me.collision.types.USER << 0,\n\t * OPEN_DOOR : me.collision.types.USER << 1,\n\t * LOOT : me.collision.types.USER << 2,\n\t * };\n\t *\n\t * // Set collision type for a door entity\n\t * myDoorEntity.body.collisionType = game.collisionTypes.LOCKED_DOOR;\n\t *\n\t * // Set collision mask for the player entity, so it collides with locked doors and loot\n\t * myPlayerEntity.body.setCollisionMask(\n\t * me.collision.types.ENEMY_OBJECT |\n\t * me.collision.types.WORLD_SHAPE |\n\t * game.collisionTypes.LOCKED_DOOR |\n\t * game.collisionTypes.LOOT\n\t * );\n\t */\n\ttypes: {\n\t\t/** to disable collision check */\n\t\tNO_OBJECT: 0,\n\t\tPLAYER_OBJECT: 1 << 0,\n\t\tNPC_OBJECT: 1 << 1,\n\t\tENEMY_OBJECT: 1 << 2,\n\t\tCOLLECTABLE_OBJECT: 1 << 3,\n\t\tACTION_OBJECT: 1 << 4, // door, etc...\n\t\tPROJECTILE_OBJECT: 1 << 5, // missiles, etc...\n\t\tWORLD_SHAPE: 1 << 6, // walls, etc...\n\t\tUSER: 1 << 7, // user-defined types start here...\n\t\tALL_OBJECT: 0xffffffff, // all objects\n\t},\n\n\t/**\n\t * Checks for object colliding with the given line\n\t * @name rayCast\n\t * @memberof collision\n\t * @public\n\t * @param {Line} line - line to be tested for collision\n\t * @param {Array.<Renderable>} [result] - a user defined array that will be populated with intersecting physic objects.\n\t * @returns {Array.<Renderable>} an array of intersecting physic objects\n\t * @example\n\t * // define a line accross the viewport\n\t * let ray = new Line(\n\t * // absolute position of the line\n\t * 0, 0, [\n\t * // starting point relative to the initial position\n\t * new me.Vector2d(0, 0),\n\t * // ending point\n\t * new me.Vector2d(me.game.viewport.width, me.game.viewport.height)\n\t * ]);\n\t *\n\t * // check for collition\n\t * result = me.collision.rayCast(ray);\n\t *\n\t * if (result.length > 0) {\n\t * // ...\n\t * }\n\t */\n\trayCast(line, result) {\n\t\treturn game.world.detector.rayCast(line, result);\n\t},\n};\n", "import { Ellipse } from \"./../geometries/ellipse.ts\";\nimport { Line, linePool } from \"./../geometries/line.ts\";\nimport { Point, pointPool } from \"../geometries/point.ts\";\nimport { Polygon, polygonPool } from \"../geometries/polygon.ts\";\nimport { Rect } from \"./../geometries/rectangle.ts\";\nimport { clamp } from \"./../math/math.ts\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport pool from \"../system/legacy_pool.js\";\nimport timer from \"./../system/timer.ts\";\nimport { remove } from \"../utils/array.ts\";\nimport { Bounds, boundsPool } from \"./bounds.ts\";\nimport { collision } from \"./collision.js\";\n\n/**\n * @import Entity from \"./../renderable/entity/entity.js\";\n * @import Container from \"./../renderable/container.js\";\n * @import Renderable from \"./../renderable/renderable.js\";\n * @import Sprite from \"./../renderable/sprite.js\";\n * @import NineSliceSprite from \"./../renderable/nineslicesprite.js\";\n * @import {Vector2d} from \"../math/vector2d.js\";\n * @import ResponseObject from \"./response.js\";\n **/\n\n/**\n * a Generic Physic Body Object with some physic properties and behavior functionality, to add as a member of a Renderable.\n * @see Renderable.body\n */\nexport default class Body {\n\t/**\n\t * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} ancestor - the parent object this body is attached to\n\t * @param {Rect|Rect[]|Polygon|Polygon[]|Line|Line[]|Ellipse|Ellipse[]|Point|Point[]|Bounds|Bounds[]|object} [shapes] - a initial shape, list of shapes, or JSON object defining the body\n\t * @param {Function} [onBodyUpdate] - callback for when the body is updated (e.g. add/remove shapes)\n\t */\n\tconstructor(ancestor, shapes, onBodyUpdate) {\n\t\t/**\n\t\t * a reference to the parent object that contains this body,\n\t\t * or undefined if it has not been added to one.\n\t\t * @public\n\t\t * @type {Renderable|Container|Entity|Sprite|NineSliceSprite}\n\t\t * @default undefined\n\t\t */\n\t\tthis.ancestor = ancestor;\n\n\t\tif (typeof this.bounds === \"undefined\") {\n\t\t\t/**\n\t\t\t * The AABB bounds box reprensenting this body\n\t\t\t * @public\n\t\t\t * @type {Bounds}\n\t\t\t */\n\t\t\tthis.bounds = boundsPool.get();\n\t\t}\n\n\t\tif (typeof this.shapes === \"undefined\") {\n\t\t\t/**\n\t\t\t * The collision shapes of the body\n\t\t\t * @ignore\n\t\t\t * @type {Polygon[]|Line[]|Ellipse[]|Point|Point[]}\n\t\t\t */\n\t\t\tthis.shapes = [];\n\t\t}\n\n\t\t/**\n\t\t * The body collision mask, that defines what should collide with what.<br>\n\t\t * (by default will collide with all entities)\n\t\t * @ignore\n\t\t * @type {number}\n\t\t * @default collision.types.ALL_OBJECT\n\t\t * @see collision.types\n\t\t */\n\t\tthis.collisionMask = collision.types.ALL_OBJECT;\n\n\t\t/**\n\t\t * define the collision type of the body for collision filtering\n\t\t * @public\n\t\t * @type {number}\n\t\t * @default collision.types.ENEMY_OBJECT\n\t\t * @see collision.types\n\t\t * @example\n\t\t * // set the body collision type\n\t\t * body.collisionType = me.collision.types.PLAYER_OBJECT;\n\t\t */\n\t\tthis.collisionType = collision.types.ENEMY_OBJECT;\n\n\t\tif (typeof this.vel === \"undefined\") {\n\t\t\t/**\n\t\t\t * The current velocity of the body.\n\t\t\t * See to apply a force if you need to modify a body velocity\n\t\t\t * @see Body.force\n\t\t\t * @public\n\t\t\t * @type {Vector2d}\n\t\t\t * @default <0,0>\n\t\t\t */\n\t\t\tthis.vel = vector2dPool.get();\n\t\t}\n\t\tthis.vel.set(0, 0);\n\n\t\tif (typeof this.force === \"undefined\") {\n\t\t\t/**\n\t\t\t * body force to apply to this the body in the current step.\n\t\t\t * (any positive or negative force will be cancelled after every world/body update cycle)\n\t\t\t * @public\n\t\t\t * @type {Vector2d}\n\t\t\t * @default <0,0>\n\t\t\t * @see Body.setMaxVelocity\n\t\t\t * @example\n\t\t\t * // define a default maximum acceleration, initial force and friction\n\t\t\t * this.body.force.set(1, 0);\n\t\t\t * this.body.friction.set(0.4, 0);\n\t\t\t * this.body.setMaxVelocity(3, 15);\n\t\t\t *\n\t\t\t * // apply a postive or negative force when pressing left of right key\n\t\t\t * update(dt) {\n\t\t\t * if (me.input.isKeyPressed(\"left\")) {\n\t\t\t * this.body.force.x = -this.body.maxVel.x;\n\t\t\t * } else if (me.input.isKeyPressed(\"right\")) {\n\t\t\t * this.body.force.x = this.body.maxVel.x;\n\t\t\t * }\n\t\t\t * }\n\t\t\t */\n\t\t\tthis.force = vector2dPool.get();\n\t\t}\n\t\tthis.force.set(0, 0);\n\n\t\tif (typeof this.friction === \"undefined\") {\n\t\t\t/**\n\t\t\t * body friction\n\t\t\t * @public\n\t\t\t * @type {Vector2d}\n\t\t\t * @default <0,0>\n\t\t\t */\n\t\t\tthis.friction = vector2dPool.get();\n\t\t}\n\t\tthis.friction.set(0, 0);\n\n\t\t/**\n\t\t * the body bouciness level when colliding with other solid bodies :\n\t\t * a value of 0 will not bounce, a value of 1 will fully rebound.\n\t\t * @public\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bounce = 0;\n\n\t\t/**\n\t\t * the body mass\n\t\t * @public\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.mass = 1;\n\n\t\tif (typeof this.maxVel === \"undefined\") {\n\t\t\t/**\n\t\t\t * max velocity (to limit body velocity)\n\t\t\t * @public\n\t\t\t * @type {Vector2d}\n\t\t\t * @default <490,490>\n\t\t\t */\n\t\t\tthis.maxVel = vector2dPool.get();\n\t\t}\n\t\t// cap by default to half the default gravity force\n\t\tthis.maxVel.set(490, 490);\n\n\t\t/**\n\t\t * Either this body is a static body or not.\n\t\t * A static body is completely fixed and can never change position or angle.\n\t\t * @readonly\n\t\t * @public\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isStatic = false;\n\n\t\t/**\n\t\t * The degree to which this body is affected by the world gravity\n\t\t * @public\n\t\t * @see {@link World.gravity}\n\t\t * @type {number}\n\t\t * @default 1.0\n\t\t */\n\t\tthis.gravityScale = 1.0;\n\n\t\t/**\n\t\t * If true this body won't be affected by the world gravity\n\t\t * @public\n\t\t * @see {@link World.gravity}\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.ignoreGravity = false;\n\n\t\t/**\n\t\t * falling state of the body<br>\n\t\t * true if the object is falling<br>\n\t\t * false if the object is standing on something<br>\n\t\t * @readonly\n\t\t * @public\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.falling = false;\n\n\t\t/**\n\t\t * jumping state of the body<br>\n\t\t * equal true if the body is jumping<br>\n\t\t * @readonly\n\t\t * @public\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.jumping = false;\n\n\t\tif (typeof onBodyUpdate === \"function\") {\n\t\t\tthis.onBodyUpdate = onBodyUpdate;\n\t\t}\n\n\t\tthis.bounds.clear();\n\n\t\t// parses the given shapes array and add them\n\t\tif (typeof shapes !== \"undefined\") {\n\t\t\tif (Array.isArray(shapes)) {\n\t\t\t\tfor (let s = 0; s < shapes.length; s++) {\n\t\t\t\t\tthis.addShape(shapes[s]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.addShape(shapes);\n\t\t\t}\n\t\t}\n\n\t\t// automatically enable physic when a body is added to a renderable\n\t\tthis.ancestor.isKinematic = false;\n\t}\n\n\t/**\n\t * set the body as a static body\n\t * static body do not move automatically and do not check againt collision with others\n\t * @param {boolean} [isStatic=true]\n\t */\n\tsetStatic(isStatic = true) {\n\t\tthis.isStatic = isStatic === true;\n\t}\n\n\t/**\n\t * add a collision shape to this body <br>\n\t * (note: me.Rect objects will be converted to me.Polygon before being added)\n\t * @param {Rect|Polygon|Line|Ellipse|Point|Point[]|Bounds|object} shape - a shape or JSON object\n\t * @returns {number} the shape array length\n\t * @example\n\t * // add a rectangle shape\n\t * this.body.addShape(new me.Rect(0, 0, image.width, image.height));\n\t * // add a shape from a JSON object\n\t * this.body.addShape(me.loader.getJSON(\"shapesdef\").banana);\n\t */\n\taddShape(shape) {\n\t\tif (shape instanceof Rect || shape instanceof Bounds) {\n\t\t\tconst poly = shape.toPolygon();\n\t\t\tthis.shapes.push(poly);\n\t\t\t// update the body bounds\n\t\t\tthis.bounds.add(poly.points);\n\t\t\tthis.bounds.translate(poly.pos);\n\t\t} else if (shape instanceof Ellipse) {\n\t\t\tif (!this.shapes.includes(shape)) {\n\t\t\t\t// see removeShape\n\t\t\t\tthis.shapes.push(shape);\n\t\t\t}\n\t\t\t// update the body bounds\n\t\t\tthis.bounds.addBounds(shape.getBounds());\n\t\t\t// use bounds position as ellipse position is center\n\t\t\tthis.bounds.translate(shape.getBounds().x, shape.getBounds().y);\n\t\t} else if (shape instanceof Polygon) {\n\t\t\tif (!this.shapes.includes(shape)) {\n\t\t\t\t// see removeShape\n\t\t\t\tthis.shapes.push(shape);\n\t\t\t}\n\t\t\t// update the body bounds\n\t\t\tthis.bounds.add(shape.points);\n\t\t\tthis.bounds.translate(shape.pos);\n\t\t} else if (shape instanceof Point) {\n\t\t\tif (!this.shapes.includes(shape)) {\n\t\t\t\t// see removeShape\n\t\t\t\tthis.shapes.push(shape);\n\t\t\t}\n\t\t\tthis.bounds.addPoint(shape);\n\t\t} else {\n\t\t\t// JSON object\n\t\t\tthis.fromJSON(shape);\n\t\t}\n\n\t\tif (typeof this.onBodyUpdate === \"function\") {\n\t\t\tthis.onBodyUpdate(this);\n\t\t}\n\n\t\t// return the length of the shape list\n\t\treturn this.shapes.length;\n\t}\n\n\t/**\n\t * set the body vertices to the given one\n\t * @param {Vector2d[]} vertices - an array of me.Vector2d points defining a convex hull\n\t * @param {number} [index=0] - the shape object for which to set the vertices\n\t * @param {boolean} [clear=true] - either to reset the body definition before adding the new vertices\n\t */\n\tsetVertices(vertices, index = 0, clear = true) {\n\t\tconst polygon = this.getShape(index);\n\t\tif (polygon instanceof Polygon) {\n\t\t\tpolygon.setShape(0, 0, vertices);\n\t\t} else {\n\t\t\t// this will replace any other non polygon shape type if defined\n\t\t\tthis.shapes[index] = polygonPool.get(0, 0, vertices);\n\t\t}\n\n\t\t// update the body bounds to take in account the new vertices\n\t\tthis.bounds.add(this.shapes[index].points, clear);\n\n\t\tif (typeof this.onBodyUpdate === \"function\") {\n\t\t\tthis.onBodyUpdate(this);\n\t\t}\n\t}\n\n\t/**\n\t * add the given vertices to the body shape\n\t * @param {Vector2d[]} vertices - an array of me.Vector2d points defining a convex hull\n\t * @param {number} [index=0] - the shape object for which to set the vertices\n\t */\n\taddVertices(vertices, index = 0) {\n\t\tthis.setVertices(vertices, index, false);\n\t}\n\n\t/**\n\t * add collision mesh based on a JSON object\n\t * (this will also apply any physic properties defined in the given JSON file)\n\t * @param {object} json - a JSON object as exported from a Physics Editor tool\n\t * @param {string} [id] - an optional shape identifier within the given the json object\n\t * @see https://www.codeandweb.com/physicseditor\n\t * @returns {number} how many shapes were added to the body\n\t * @example\n\t * // define the body based on the banana shape\n\t * this.body.fromJSON(me.loader.getJSON(\"shapesdef\").banana);\n\t * // or ...\n\t * this.body.fromJSON(me.loader.getJSON(\"shapesdef\"), \"banana\");\n\t */\n\tfromJSON(json, id) {\n\t\tlet data = json;\n\n\t\tif (typeof id !== \"undefined\") {\n\t\t\tdata = json[id];\n\t\t}\n\n\t\t// Physic Editor Format (https://www.codeandweb.com/physicseditor)\n\t\tif (typeof data === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"Identifier (\" + id + \") undefined for the given JSON object)\",\n\t\t\t);\n\t\t}\n\n\t\tif (data.length) {\n\t\t\t// go through all shapes and add them to the body\n\t\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\t\tthis.addVertices(data[i].shape, i);\n\t\t\t}\n\t\t\t// apply density, friction and bounce properties from the first shape\n\t\t\t// Note : how to manage different mass or friction for all different shapes?\n\t\t\tthis.mass = data[0].density || 0;\n\t\t\tthis.friction.set(data[0].friction || 0, data[0].friction || 0);\n\t\t\tthis.bounce = data[0].bounce || 0;\n\t\t}\n\n\t\t// return the amount of shapes added to the body\n\t\treturn data.length;\n\t}\n\n\t/**\n\t * return the collision shape at the given index\n\t * @param {number} [index=0] - the shape object at the specified index\n\t * @returns {Polygon|Line|Ellipse} shape a shape object if defined\n\t */\n\tgetShape(index) {\n\t\treturn this.shapes[index || 0];\n\t}\n\n\t/**\n\t * returns the AABB bounding box for this body\n\t * @returns {Bounds} bounding box Rectangle object\n\t */\n\tgetBounds() {\n\t\treturn this.bounds;\n\t}\n\n\t/**\n\t * remove the specified shape from the body shape list\n\t * @param {Polygon|Line|Ellipse} shape - a shape object\n\t * @returns {number} the shape array length\n\t */\n\tremoveShape(shape) {\n\t\t// clear the current bounds\n\t\tthis.bounds.clear();\n\t\t// remove the shape from shape list\n\t\tremove(this.shapes, shape);\n\t\t// add everything left back\n\t\tfor (let s = 0; s < this.shapes.length; s++) {\n\t\t\tthis.addShape(this.shapes[s]);\n\t\t}\n\t\t// return the length of the shape list\n\t\treturn this.shapes.length;\n\t}\n\n\t/**\n\t * remove the shape at the given index from the body shape list\n\t * @param {number} index - the shape object at the specified index\n\t * @returns {number} the shape array length\n\t */\n\tremoveShapeAt(index) {\n\t\treturn this.removeShape(this.getShape(index));\n\t}\n\n\t/**\n\t * By default all physic bodies are able to collide with all other bodies, <br>\n\t * but it's also possible to specify 'collision filters' to provide a finer <br>\n\t * control over which body can collide with each other.\n\t * @see collision.types\n\t * @param {number} [bitmask = collision.types.ALL_OBJECT] - the collision mask\n\t * @example\n\t * // filter collision detection with collision shapes, enemies and collectables\n\t * body.setCollisionMask(me.collision.types.WORLD_SHAPE | me.collision.types.ENEMY_OBJECT | me.collision.types.COLLECTABLE_OBJECT);\n\t * ...\n\t * // disable collision detection with all other objects\n\t * body.setCollisionMask(me.collision.types.NO_OBJECT);\n\t */\n\tsetCollisionMask(bitmask = collision.types.ALL_OBJECT) {\n\t\tthis.collisionMask = bitmask;\n\t}\n\n\t/**\n\t * define the collision type of the body for collision filtering\n\t * @see collision.types\n\t * @param {number} type - the collision type\n\t * @example\n\t * // set the body collision type\n\t * body.collisionType = me.collision.types.PLAYER_OBJECT;\n\t */\n\tsetCollisionType(type) {\n\t\tif (typeof type !== \"undefined\") {\n\t\t\tif (typeof type === \"string\") {\n\t\t\t\tif (typeof collision.types[type] !== \"undefined\") {\n\t\t\t\t\tthis.collisionType = collision.types[type];\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid value for the collisionType property\");\n\t\t\t\t}\n\t\t\t} else if (typeof type === \"number\") {\n\t\t\t\tthis.collisionType = type;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Invalid value for the collisionType property\");\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * the built-in function to solve the collision response\n\t * @param {ResponseObject} response - the collision response object\n\t * @see {@link ResponseObject}\n\t */\n\trespondToCollision(response) {\n\t\t// the overlap vector\n\t\tconst overlap = response.overlapV;\n\t\tconst overlapN = response.overlapN;\n\n\t\t// FIXME: Respond proportionally to object mass\n\n\t\t// Move out of the other object shape\n\t\tthis.ancestor.pos.sub(overlap);\n\n\t\t// cancel the velocity component along the collision normal\n\t\tconst projVel = this.vel.x * overlapN.x + this.vel.y * overlapN.y;\n\t\tif (projVel > 0) {\n\t\t\tif (this.bounce > 0) {\n\t\t\t\t// reflect velocity along normal with bounce damping\n\t\t\t\tthis.vel.x -= (1 + this.bounce) * projVel * overlapN.x;\n\t\t\t\tthis.vel.y -= (1 + this.bounce) * projVel * overlapN.y;\n\t\t\t} else {\n\t\t\t\t// remove the velocity component along the collision normal\n\t\t\t\tthis.vel.x -= projVel * overlapN.x;\n\t\t\t\tthis.vel.y -= projVel * overlapN.y;\n\t\t\t}\n\t\t}\n\n\t\tif (overlap.y !== 0 && !this.ignoreGravity) {\n\t\t\t// cancel the falling an jumping flags if necessary\n\t\t\tconst dir = this.falling === true ? 1 : this.jumping === true ? -1 : 0;\n\t\t\tthis.falling = overlap.y >= dir;\n\t\t\tthis.jumping = overlap.y <= -dir;\n\t\t}\n\t}\n\n\t/**\n\t * The forEach() method executes a provided function once per body shape element. <br>\n\t * the callback function is invoked with three arguments: <br>\n\t * - The current element being processed in the array <br>\n\t * - The index of element in the array. <br>\n\t * - The array forEach() was called upon. <br>\n\t * @param {Function} callback - fnction to execute on each element\n\t * @param {object} [thisArg] - value to use as this(i.e reference Object) when executing callback.\n\t * @example\n\t * // iterate through all shapes of the physic body\n\t * mySprite.body.forEach((shape) => {\n\t * shape.doSomething();\n\t * });\n\t * mySprite.body.forEach((shape, index) => { ... });\n\t * mySprite.body.forEach((shape, index, array) => { ... });\n\t * mySprite.body.forEach((shape, index, array) => { ... }, thisArg);\n\t */\n\tforEach(callback, thisArg) {\n\t\tlet i = 0;\n\t\tconst shapes = this.shapes;\n\n\t\tconst len = shapes.length;\n\n\t\tif (typeof callback !== \"function\") {\n\t\t\tthrow new Error(callback + \" is not a function\");\n\t\t}\n\n\t\twhile (i < len) {\n\t\t\tcallback.call(thisArg ?? this, shapes[i], i, shapes);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the any of the shape composing the body contains the given point.\n\t * @param {number|Vector2d} x - x coordinate or a vector point to check\n\t * @param {number} [y] - y coordinate\n\t * @returns {boolean} true if contains\n\t * @example\n\t * if (mySprite.body.contains(10, 10)) {\n\t * // do something\n\t * }\n\t * // or\n\t * if (mySprite.body.contains(myVector2d)) {\n\t * // do something\n\t * }\n\t */\n\tcontains(...args) {\n\t\tlet _x;\n\t\tlet _y;\n\n\t\tif (args.length === 2) {\n\t\t\t// x, y\n\t\t\t[_x, _y] = args;\n\t\t} else {\n\t\t\t// vector\n\t\t\t[_x, _y] = [args[0].x, args[0].y];\n\t\t}\n\n\t\tif (this.getBounds().contains(_x, _y)) {\n\t\t\t// cannot use forEach here as cannot break out with a return\n\t\t\tfor (let i = this.shapes.length, shape; i--, (shape = this.shapes[i]); ) {\n\t\t\t\tif (shape.contains(_x, _y)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Rotate this body (counter-clockwise) by the specified angle (in radians).\n\t * Unless specified the body will be rotated around its center point\n\t * @param {number} angle - The angle to rotate (in radians)\n\t * @param {Vector2d} [v=Body.getBounds().center] - an optional point to rotate around\n\t * @returns {Body} Reference to this object for method chaining\n\t */\n\trotate(angle, v = this.getBounds().center) {\n\t\tif (angle !== 0) {\n\t\t\tthis.bounds.clear();\n\t\t\tthis.forEach((shape) => {\n\t\t\t\tshape.rotate(angle, v);\n\t\t\t\tthis.bounds.addBounds(shape.getBounds());\n\t\t\t\t/*\n if (!(shape instanceof Ellipse)) {\n // ellipse position is center\n this.bounds.translate(shape.pos);\n }\n */\n\t\t\t});\n\t\t\t/*\n if (typeof this.onBodyUpdate === \"function\") {\n this.onBodyUpdate(this);\n }\n */\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * cap the body velocity (body.maxVel property) to the specified value<br>\n\t * @param {number} x - max velocity on x axis\n\t * @param {number} y - max velocity on y axis\n\t */\n\tsetMaxVelocity(x, y) {\n\t\tthis.maxVel.x = x;\n\t\tthis.maxVel.y = y;\n\t}\n\n\t/**\n\t * set the body default friction\n\t * @param {number} x - horizontal friction\n\t * @param {number} y - vertical friction\n\t */\n\tsetFriction(x = 0, y = 0) {\n\t\tthis.friction.x = x;\n\t\tthis.friction.y = y;\n\t}\n\n\t/**\n\t * Updates the parent's position as well as computes the new body's velocity based\n\t * on the values of force/friction. Velocity chages are proportional to the\n\t * me.timer.tick value (which can be used to scale velocities). The approach to moving the\n\t * parent renderable is to compute new values of the Body.vel property then add them to\n\t * the parent.pos value thus changing the postion the amount of Body.vel each time the\n\t * update call is made. <br>\n\t * Updates to Body.vel are bounded by maxVel (which defaults to viewport size if not set) <br>\n\t * At this time a call to Body.Update does not call the onBodyUpdate callback that is listed in the constructor arguments.\n\t * @protected\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean} true if resulting velocity is different than 0\n\t */\n\tupdate() {\n\t\t// apply timer.tick to delta time for linear interpolation (when enabled)\n\t\t// #761 add delta time in body update\n\t\tconst deltaTime = /* dt * */ timer.tick;\n\n\t\t// apply force if defined\n\t\tif (this.force.x !== 0) {\n\t\t\tthis.vel.x += this.force.x * deltaTime;\n\t\t}\n\t\tif (this.force.y !== 0) {\n\t\t\tthis.vel.y += this.force.y * deltaTime;\n\t\t}\n\n\t\t// apply friction if defined\n\t\tif (this.friction.x > 0) {\n\t\t\tconst fx = this.friction.x * deltaTime;\n\t\t\tconst nx = this.vel.x + fx;\n\t\t\tconst x = this.vel.x - fx;\n\n\t\t\tthis.vel.x = nx < 0 ? nx : x > 0 ? x : 0;\n\t\t}\n\t\tif (this.friction.y > 0) {\n\t\t\tconst fy = this.friction.y * deltaTime;\n\t\t\tconst ny = this.vel.y + fy;\n\t\t\tconst y = this.vel.y - fy;\n\n\t\t\tthis.vel.y = ny < 0 ? ny : y > 0 ? y : 0;\n\t\t}\n\n\t\t// cap velocity\n\t\tif (this.vel.y !== 0) {\n\t\t\tthis.vel.y = clamp(this.vel.y, -this.maxVel.y, this.maxVel.y);\n\t\t}\n\t\tif (this.vel.x !== 0) {\n\t\t\tthis.vel.x = clamp(this.vel.x, -this.maxVel.x, this.maxVel.x);\n\t\t}\n\n\t\t// check if falling / jumping\n\t\tthis.falling = this.vel.y * Math.sign(this.force.y) > 0;\n\t\tthis.jumping = this.falling ? false : this.jumping;\n\n\t\t// update the body ancestor position\n\t\tthis.ancestor.pos.add(this.vel);\n\n\t\t// returns true if vel is different from 0\n\t\treturn this.vel.x !== 0 || this.vel.y !== 0;\n\t}\n\n\t/**\n\t * Destroy function<br>\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// push back instance into object pool\n\t\tboundsPool.release(this.bounds);\n\t\tvector2dPool.release(this.vel);\n\t\tvector2dPool.release(this.force);\n\t\tvector2dPool.release(this.friction);\n\t\tvector2dPool.release(this.maxVel);\n\t\tthis.shapes.forEach((shape) => {\n\t\t\tif (shape instanceof Point) {\n\t\t\t\tpointPool.release(shape);\n\t\t\t} else if (shape instanceof Line) {\n\t\t\t\tlinePool.release(shape);\n\t\t\t} else if (shape instanceof Polygon) {\n\t\t\t\tpolygonPool.release(shape);\n\t\t\t} else {\n\t\t\t\tpool.push(shape);\n\t\t\t}\n\t\t});\n\n\t\t// set to undefined\n\t\tthis.onBodyUpdate = undefined;\n\t\tthis.ancestor = undefined;\n\t\tthis.bounds = undefined;\n\t\tthis.vel = undefined;\n\t\tthis.force = undefined;\n\t\tthis.friction = undefined;\n\t\tthis.maxVel = undefined;\n\t\tthis.shapes.length = 0;\n\n\t\t// reset some variable to default\n\t\tthis.setStatic(false);\n\t}\n}\n", "/**\n * @ignore\n */\nexport function extractAttributes(gl, shader) {\n\tconst attributes = {};\n\tconst attrRx = /attribute\\s+\\w+\\s+(\\w+)/g;\n\tlet match;\n\tlet i = 0;\n\n\t// Detect all attribute names\n\twhile ((match = attrRx.exec(shader.vertex))) {\n\t\tattributes[match[1]] = i++;\n\t}\n\n\treturn attributes;\n}\n", "/**\n * set precision for the fiven shader source\n * won't do anything if the precision is already specified\n * @ignore\n */\nexport function setPrecision(src, precision) {\n\tif (src.substring(0, 9) !== \"precision\") {\n\t\treturn \"precision \" + precision + \" float;\" + src;\n\t}\n\treturn src;\n}\n\n/**\n * return the highest precision format supported by this device for GL Shaders\n * @ignore\n * @param {WebGLRenderingContext} gl - the current WebGL context\n * @returns {boolean} \"lowp\", \"mediump\", or \"highp\"\n */\nexport function getMaxShaderPrecision(gl) {\n\tif (\n\t\tgl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision >\n\t\t\t0 &&\n\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0\n\t) {\n\t\treturn \"highp\";\n\t}\n\tif (\n\t\tgl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision >\n\t\t\t0 &&\n\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision >\n\t\t\t0\n\t) {\n\t\treturn \"mediump\";\n\t}\n\treturn \"lowp\";\n}\n", "/**\n * @ignore\n */\nfunction compileShader(gl, type, source) {\n\tconst shader = gl.createShader(type);\n\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\n\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\tthrow new Error(gl.getShaderInfoLog(shader));\n\t}\n\n\treturn shader;\n}\n\n/**\n * Compile GLSL into a shader object\n * @ignore\n */\nexport function compileProgram(gl, vertex, fragment, attributes) {\n\tconst vertShader = compileShader(gl, gl.VERTEX_SHADER, vertex);\n\tconst fragShader = compileShader(gl, gl.FRAGMENT_SHADER, fragment);\n\n\tlet program = gl.createProgram();\n\n\tgl.attachShader(program, vertShader);\n\tgl.attachShader(program, fragShader);\n\n\t// force vertex attributes to use location 0 as starting location to prevent\n\t// browser to do complicated emulation when running on desktop OpenGL (e.g. on macOS)\n\tfor (const location in attributes) {\n\t\tgl.bindAttribLocation(program, attributes[location], location);\n\t}\n\n\tgl.linkProgram(program);\n\n\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\tconst error_msg =\n\t\t\t\"Error initializing Shader \" +\n\t\t\tthis +\n\t\t\t\"\\n\" +\n\t\t\t\"gl.VALIDATE_STATUS: \" +\n\t\t\tgl.getProgramParameter(program, gl.VALIDATE_STATUS) +\n\t\t\t\"\\n\" +\n\t\t\t\"gl.getError()\" +\n\t\t\tgl.getError() +\n\t\t\t\"\\n\" +\n\t\t\t\"gl.getProgramInfoLog()\" +\n\t\t\tgl.getProgramInfoLog(program);\n\t\t// house cleaning\n\t\tgl.deleteProgram(program);\n\t\tprogram = null;\n\t\t// throw the exception\n\t\tthrow new Error(error_msg);\n\t}\n\n\tgl.useProgram(program);\n\n\t// clean-up\n\tgl.deleteShader(vertShader);\n\tgl.deleteShader(fragShader);\n\n\treturn program;\n}\n", "/**\n * clean the given source from space, comments, etc...\n * @ignore\n */\nexport function minify(src) {\n\t// remove comments\n\tsrc = src.replace(/\\/\\*[\\s\\S]*?\\*\\/|([^\\\\:]|^)\\/\\/.*$/gm, \"$1\");\n\t// Remove leading and trailing whitespace from lines\n\tsrc = src.replace(/(\\\\n\\s+)|(\\s+\\\\n)/g, \"\");\n\t// Remove line breaks\n\tsrc = src.replace(/(\\\\r|\\\\n)+/g, \"\");\n\t// Remove unnecessary whitespace\n\tsrc = src.replace(/\\s*([;,[\\](){}\\\\\\/\\-+*|^&!=<>?~%])\\s*/g, \"$1\");\n\n\treturn src;\n}\n", "/**\n * Hash map of GLSL data types to WebGL Uniform methods\n * @ignore\n */\nconst fnHash = {\n\tbool: \"1i\",\n\tint: \"1i\",\n\tfloat: \"1f\",\n\tvec2: \"2fv\",\n\tvec3: \"3fv\",\n\tvec4: \"4fv\",\n\tbvec2: \"2iv\",\n\tbvec3: \"3iv\",\n\tbvec4: \"4iv\",\n\tivec2: \"2iv\",\n\tivec3: \"3iv\",\n\tivec4: \"4iv\",\n\tmat2: \"Matrix2fv\",\n\tmat3: \"Matrix3fv\",\n\tmat4: \"Matrix4fv\",\n\tsampler2D: \"1i\",\n};\n\n/**\n * @ignore\n */\nexport function extractUniforms(gl, shader) {\n\tconst uniforms = {};\n\tconst uniRx = /uniform\\s+(\\w+)\\s+(\\w+)/g;\n\tconst uniformsData = {};\n\tconst descriptor = {};\n\tconst locations = {};\n\tlet match;\n\n\t// Detect all uniform names and types\n\t[shader.vertex, shader.fragment].forEach((shader) => {\n\t\twhile ((match = uniRx.exec(shader))) {\n\t\t\tuniformsData[match[2]] = match[1];\n\t\t}\n\t});\n\n\t// Get uniform references\n\tObject.keys(uniformsData).forEach((name) => {\n\t\tconst type = uniformsData[name];\n\t\tlocations[name] = gl.getUniformLocation(shader.program, name);\n\n\t\tdescriptor[name] = {\n\t\t\tget: (function (name) {\n\t\t\t\t/*\n\t\t\t\t * A getter for the uniform location\n\t\t\t\t */\n\t\t\t\treturn function () {\n\t\t\t\t\treturn locations[name];\n\t\t\t\t};\n\t\t\t})(name),\n\t\t\tset: (function (name, type, fn) {\n\t\t\t\tif (/^mat/.test(type)) {\n\t\t\t\t\t/*\n\t\t\t\t\t * A generic setter for uniform matrices\n\t\t\t\t\t */\n\t\t\t\t\treturn function (val) {\n\t\t\t\t\t\tgl[fn](locations[name], false, val);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * A generic setter for uniform vectors\n\t\t\t\t\t */\n\t\t\t\t\treturn function (val) {\n\t\t\t\t\t\tlet fnv = fn;\n\t\t\t\t\t\tif (val.length && /v$/.test(fn)) {\n\t\t\t\t\t\t\tfnv += \"v\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgl[fnv](locations[name], val);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t})(name, type, \"uniform\" + fnHash[type]),\n\t\t};\n\t});\n\tObject.defineProperties(uniforms, descriptor);\n\n\treturn uniforms;\n}\n", "import { eventEmitter, ONCONTEXT_LOST } from \"../../system/event.ts\";\nimport { extractAttributes } from \"./utils/attributes.js\";\nimport { getMaxShaderPrecision, setPrecision } from \"./utils/precision.js\";\nimport { compileProgram } from \"./utils/program.js\";\nimport { minify } from \"./utils/string.js\";\nimport { extractUniforms } from \"./utils/uniforms.js\";\n\n/**\n * a base GL Shader object\n */\nexport default class GLShader {\n\t/**\n\t * @param {WebGLRenderingContext} gl - the current WebGL rendering context\n\t * @param {string} vertex - a string containing the GLSL source code to set\n\t * @param {string} fragment - a string containing the GLSL source code to set\n\t * @param {string} [precision=auto detected] - float precision ('lowp', 'mediump' or 'highp').\n\t * @see https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_on_the_web/GLSL_Shaders\n\t * @example\n\t * // create a basic shader\n\t * let myShader = new me.GLShader(\n\t * // WebGL rendering context\n\t * gl,\n\t * // vertex shader\n\t * [\n\t * \"void main() {\",\n\t * \" gl_Position = doMathToMakeClipspaceCoordinates;\",\n\t * \"}\"\n\t * ].join(\"\\n\"),\n\t * // fragment shader\n\t * [\n\t * \"void main() {\",\n\t * \" gl_FragColor = doMathToMakeAColor;\",\n\t * \"}\"\n\t * ].join(\"\\n\")\n\t * )\n\t * // use the shader\n\t * myShader.bind();\n\t */\n\tconstructor(gl, vertex, fragment, precision) {\n\t\t/**\n\t\t * the active gl rendering context\n\t\t * @type {WebGLRenderingContext}\n\t\t */\n\t\tthis.gl = gl;\n\n\t\t/**\n\t\t * the vertex shader source code\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertex = setPrecision(\n\t\t\tminify(vertex),\n\t\t\tprecision || getMaxShaderPrecision(this.gl),\n\t\t);\n\n\t\t/**\n\t\t * the fragment shader source code\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragment = setPrecision(\n\t\t\tminify(fragment),\n\t\t\tprecision || getMaxShaderPrecision(this.gl),\n\t\t);\n\n\t\t/**\n\t\t * the location attributes of the shader\n\t\t * @type {GLint[]}\n\t\t */\n\t\tthis.attributes = extractAttributes(this.gl, this);\n\n\t\t/**\n\t\t * a reference to the shader program (once compiled)\n\t\t * @type {WebGLProgram}\n\t\t */\n\t\tthis.program = compileProgram(\n\t\t\tthis.gl,\n\t\t\tthis.vertex,\n\t\t\tthis.fragment,\n\t\t\tthis.attributes,\n\t\t);\n\n\t\t/**\n\t\t * the uniforms of the shader\n\t\t * @type {object}\n\t\t */\n\t\tthis.uniforms = extractUniforms(this.gl, this);\n\n\t\t// destroy the shader on context lost (will be recreated on context restore)\n\t\teventEmitter.addListener(ONCONTEXT_LOST, this.destroy.bind(this));\n\t}\n\n\t/**\n\t * Installs this shader program as part of current rendering state\n\t */\n\tbind() {\n\t\tthis.gl.useProgram(this.program);\n\t}\n\n\t/**\n\t * returns the location of an attribute variable in this shader program\n\t * @param {string} name - the name of the attribute variable whose location to get.\n\t * @returns {GLint} number indicating the location of the variable name if found. Returns -1 otherwise\n\t */\n\tgetAttribLocation(name) {\n\t\tconst attr = this.attributes[name];\n\t\tif (typeof attr !== \"undefined\") {\n\t\t\treturn attr;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/**\n\t * Set the uniform to the given value\n\t * @param {string} name - the uniform name\n\t * @param {object|Float32Array} value - the value to assign to that uniform\n\t * @example\n\t * myShader.setUniform(\"uProjectionMatrix\", this.projectionMatrix);\n\t */\n\tsetUniform(name, value) {\n\t\tconst uniforms = this.uniforms;\n\t\tif (typeof uniforms[name] !== \"undefined\") {\n\t\t\tif (typeof value === \"object\" && typeof value.toArray === \"function\") {\n\t\t\t\tuniforms[name] = value.toArray();\n\t\t\t} else {\n\t\t\t\tuniforms[name] = value;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"undefined (\" + name + \") uniform for shader \" + this);\n\t\t}\n\t}\n\n\t/**\n\t * activate the given vertex attribute for this shader\n\t * @param {WebGLRenderingContext} gl - the current WebGL rendering context\n\t * @param {object[]} attributes - an array of vertex attributes\n\t * @param {number} vertexByteSize - the size of a single vertex in bytes\n\t */\n\tsetVertexAttributes(gl, attributes, vertexByteSize) {\n\t\t// set the vertex attributes\n\t\tfor (let index = 0; index < attributes.length; ++index) {\n\t\t\tconst element = attributes[index];\n\t\t\tconst location = this.getAttribLocation(element.name);\n\n\t\t\tif (location !== -1) {\n\t\t\t\tgl.enableVertexAttribArray(location);\n\t\t\t\tgl.vertexAttribPointer(\n\t\t\t\t\tlocation,\n\t\t\t\t\telement.size,\n\t\t\t\t\telement.type,\n\t\t\t\t\telement.normalized,\n\t\t\t\t\tvertexByteSize,\n\t\t\t\t\telement.offset,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.disableVertexAttribArray(index);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * destroy this shader objects resources (program, attributes, uniforms)\n\t */\n\tdestroy() {\n\t\tthis.uniforms = null;\n\t\tthis.attributes = null;\n\n\t\tthis.gl.deleteProgram(this.program);\n\n\t\tthis.vertex = null;\n\t\tthis.fragment = null;\n\t}\n}\n", "import { ObservablePoint } from \"../geometries/observablePoint.ts\";\nimport { Rect } from \"./../geometries/rectangle.ts\";\nimport { releaseAllPointerEvents } from \"./../input/input.js\";\nimport { Color, colorPool } from \"./../math/color.ts\";\nimport { clamp } from \"./../math/math.ts\";\nimport { matrix2dPool } from \"../math/matrix2d.ts\";\nimport { ObservableVector3d } from \"../math/observableVector3d.ts\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport Body from \"./../physics/body.js\";\nimport { Bounds, boundsPool } from \"./../physics/bounds.ts\";\nimport pool from \"../system/legacy_pool.js\";\nimport GLShader from \"./../video/webgl/glshader.js\";\n\n/**\n * additional import for TypeScript\n * @import {Matrix2d} from \"../math/matrix2d.ts\";\n * @import Entity from \"./entity/entity.js\";\n * @import Container from \"./container.js\";\n * @import {Line} from \"./../geometries/line.ts\";\n * @import {Ellipse} from \"./../geometries/ellipse.ts\";\n * @import {Polygon} from \"../geometries/polygon.ts\";\n * @import {RoundRect} from \"./../geometries/roundrect.ts\";\n * @import Application from \"./../application/application.js\";\n * @import CanvasRenderer from \"./../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n * @import ResponseObject from \"./../physics/response.js\";\n **/\n\n/**\n * A base class for renderable objects.\n */\nexport default class Renderable extends Rect {\n\t/**\n\t * @param {number} x - position of the renderable object (accessible through inherited pos.x property)\n\t * @param {number} y - position of the renderable object (accessible through inherited pos.y property)\n\t * @param {number} width - object width\n\t * @param {number} height - object height\n\t */\n\tconstructor(x, y, width, height) {\n\t\t// parent constructor\n\t\tsuper(x, y, width, height);\n\n\t\t/**\n\t\t * Position of the Renderable relative to its parent container\n\t\t * @public\n\t\t * @type {ObservableVector3d}\n\t\t */\n\t\tthis.pos = new ObservableVector3d(x, y, 0, () => {\n\t\t\tthis.updateBounds();\n\t\t\tthis.isDirty = true;\n\t\t});\n\n\t\t/**\n\t\t * The anchor point is used for attachment behavior, and/or when applying transformations.<br>\n\t\t * The coordinate system places the origin at the top left corner of the frame (0, 0) and (1, 1) means the bottom-right corner<br>\n\t\t * <img src=\"images/anchor_point.png\"/><br>\n\t\t * a Renderable's anchor point defaults to (0.5,0.5), which corresponds to the center position.<br>\n\t\t * <br>\n\t\t * <i><b>Note:</b> Object created through Tiled will have their anchorPoint set to (0, 0) to match Tiled Level editor implementation.\n\t\t * To specify a value through Tiled, use a json expression like `json:{\"x\":0.5,\"y\":0.5}`. </i>\n\t\t * @type {ObservablePoint}\n\t\t * @default <0.5,0.5>\n\t\t */\n\t\tthis.anchorPoint = new ObservablePoint(0.5, 0.5, () => {\n\t\t\tthis.updateBounds();\n\t\t\tthis.isDirty = true;\n\t\t});\n\n\t\tif (typeof this.currentTransform === \"undefined\") {\n\t\t\t/**\n\t\t\t * the renderable default transformation matrix\n\t\t\t * @type {Matrix2d}\n\t\t\t */\n\t\t\tthis.currentTransform = matrix2dPool.get();\n\t\t}\n\t\tthis.currentTransform.identity();\n\n\t\t/**\n\t\t * the renderable physic body\n\t\t * @type {Body}\n\t\t * @example\n\t\t * // define a new Player Class\n\t\t * class PlayerEntity extends me.Sprite {\n\t\t * // constructor\n\t\t * constructor(x, y, settings) {\n\t\t * // call the parent constructor\n\t\t * super(x, y , settings);\n\t\t *\n\t\t * // define a basic walking animation\n\t\t * this.addAnimation(\"walk\", [...]);\n\t\t * // define a standing animation (using the first frame)\n\t\t * this.addAnimation(\"stand\", [...]);\n\t\t * // set the standing animation as default\n\t\t * this.setCurrentAnimation(\"stand\");\n\t\t *\n\t\t * // add a physic body\n\t\t * this.body = new me.Body(this);\n\t\t * // add a default collision shape\n\t\t * this.body.addShape(new me.Rect(0, 0, this.width, this.height));\n\t\t * // configure max speed, friction, and initial force to be applied\n\t\t * this.body.setMaxVelocity(3, 15);\n\t\t * this.body.setFriction(0.4, 0);\n\t\t * this.body.force.set(3, 0);\n\t\t * this.isKinematic = false;\n\t\t *\n\t\t * // set the display to follow our position on both axis\n\t\t * me.game.viewport.follow(this.pos, me.game.viewport.AXIS.BOTH);\n\t\t * }\n\t\t *\n\t\t * ...\n\t\t *\n\t\t * }\n\t\t */\n\t\tthis.body = undefined;\n\n\t\t/**\n\t\t * (G)ame (U)nique (Id)entifier\" <br>\n\t\t * a GUID will be allocated for any renderable object added <br>\n\t\t * to an object container (including the `me.game.world` container)\n\t\t * @type {string}\n\t\t */\n\t\tthis.GUID = undefined;\n\n\t\t/**\n\t\t * an event handler that is called when the renderable leave or enter a camera viewport\n\t\t * @type {Function}\n\t\t * @default undefined\n\t\t * @example\n\t\t * this.onVisibilityChange = function(inViewport) {\n\t\t * if (inViewport === true) {\n\t\t * console.log(\"object has entered the in a camera viewport!\");\n\t\t * }\n\t\t * };\n\t\t */\n\t\tthis.onVisibilityChange = undefined;\n\n\t\t/**\n\t\t * Whether the renderable object will always update, even when outside of the viewport<br>\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alwaysUpdate = false;\n\n\t\t/**\n\t\t * Whether to update this object when the game is paused.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.updateWhenPaused = false;\n\n\t\t/**\n\t\t * make the renderable object persistent over level changes<br>\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isPersistent = false;\n\n\t\t/**\n\t\t * If true, this renderable will be rendered using screen coordinates,\n\t\t * as opposed to world coordinates. Use this, for example, to define UI elements.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.floating = false;\n\n\t\t/**\n\t\t * When enabled, an object container will automatically apply\n\t\t * any defined transformation before calling the child draw method.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t * @example\n\t\t * // enable \"automatic\" transformation when the object is activated\n\t\t * onActivateEvent: function () {\n\t\t * // reset the transformation matrix\n\t\t * this.currentTransform.identity();\n\t\t * // ensure the anchor point is the renderable center\n\t\t * this.anchorPoint.set(0.5, 0.5);\n\t\t * // enable auto transform\n\t\t * this.autoTransform = true;\n\t\t * ....\n\t\t * }\n\t\t */\n\t\tthis.autoTransform = true;\n\n\t\t/**\n\t\t * Define the renderable opacity<br>\n\t\t * Set to zero if you do not wish an object to be drawn\n\t\t * @see Renderable#setOpacity\n\t\t * @see Renderable#getOpacity\n\t\t * @type {number}\n\t\t * @default 1.0\n\t\t */\n\t\tthis.alpha = 1.0;\n\n\t\t/**\n\t\t * a reference to the parent object that contains this renderable\n\t\t * @type {Container|Entity}\n\t\t * @default undefined\n\t\t */\n\t\tthis.ancestor = undefined;\n\n\t\t/**\n\t\t * A mask limits rendering elements to the shape and position of the given mask object.\n\t\t * So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.\n\t\t * @type {Rect|RoundRect|Polygon|Line|Ellipse}\n\t\t * @default undefined\n\t\t * @example\n\t\t * // apply a mask in the shape of a Star\n\t\t * myNPCSprite.mask = new me.Polygon(myNPCSprite.width / 2, 0, [\n\t\t * // draw a star\n\t\t * {x: 0, y: 0},\n\t\t * {x: 14, y: 30},\n\t\t * {x: 47, y: 35},\n\t\t * {x: 23, y: 57},\n\t\t * {x: 44, y: 90},\n\t\t * {x: 0, y: 62},\n\t\t * {x: -44, y: 90},\n\t\t * {x: -23, y: 57},\n\t\t * {x: -47, y: 35},\n\t\t * {x: -14, y: 30}\n\t\t * ]);\n\t\t */\n\t\tthis.mask = undefined;\n\n\t\t/**\n\t\t * (Experimental) an optional shader, to be used instead of the default built-in one, when drawing this renderable (WebGL only)\n\t\t * @type {GLShader}\n\t\t * @default undefined\n\t\t */\n\t\tthis.shader = undefined;\n\n\t\t/**\n\t\t * the blend mode to be applied to this renderable (see renderer setBlendMode for available blend mode)\n\t\t * @type {string}\n\t\t * @default \"normal\"\n\t\t * @see CanvasRenderer#setBlendMode\n\t\t * @see WebGLRenderer#setBlendMode\n\t\t */\n\t\tthis.blendMode = \"normal\";\n\n\t\t/**\n\t\t * The name of the renderable\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.name = \"\";\n\n\t\t/**\n\t\t * to identify the object as a renderable object\n\t\t * @ignore\n\t\t */\n\t\tthis.isRenderable = true;\n\n\t\t/**\n\t\t * If true then physic collision and input events will not impact this renderable\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.isKinematic = true;\n\n\t\t/**\n\t\t * when true the renderable will be redrawn during the next update cycle\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.isDirty = true;\n\n\t\t/**\n\t\t * cache the absolute position of the renderable\n\t\t * @ignore\n\t\t */\n\t\tthis._absPos = undefined;\n\n\t\t/**\n\t\t * keep track of when we flip\n\t\t * @ignore\n\t\t */\n\t\tthis._flip = {\n\t\t\tx: false,\n\t\t\ty: false,\n\t\t};\n\n\t\t/**\n\t\t * viewport flag\n\t\t * @ignore\n\t\t */\n\t\tthis._inViewport = false;\n\n\t\t/**\n\t\t * cache value for the parentApp\n\t\t * @ignore\n\t\t */\n\t\tthis._parentApp = undefined;\n\n\t\t/**\n\t\t * renderable cache tint value used by the getter/setter\n\t\t * @ignore\n\t\t */\n\t\tthis._tint = colorPool.get(255, 255, 255, 1.0);\n\n\t\t// ensure it's fully opaque by default\n\t\tthis.setOpacity(1.0);\n\t}\n\n\t/**\n\t * returns the parent application (or game) to which this renderable is attached to\n\t * @return {Application} the parent application or undefined if not attached to any container/app\n\t */\n\tget parentApp() {\n\t\tif (typeof this._parentApp === \"undefined\") {\n\t\t\tif (\n\t\t\t\ttypeof this.ancestor !== \"undefined\" &&\n\t\t\t\ttypeof this.ancestor.getRootAncestor === \"function\"\n\t\t\t) {\n\t\t\t\t// the `app` property is only defined in the world \"root\" container\n\t\t\t\tthis._parentApp = this.ancestor.getRootAncestor().app;\n\t\t\t}\n\t\t}\n\t\treturn this._parentApp;\n\t}\n\n\t/**\n\t * Whether the renderable object is floating (i.e. used screen coordinates), or contained in a floating parent container\n\t * @see Renderable#floating\n\t * @type {boolean}\n\t */\n\tget isFloating() {\n\t\treturn (\n\t\t\tthis.floating === true ||\n\t\t\t(typeof this.ancestor !== \"undefined\" &&\n\t\t\t\tthis.ancestor.isFloating === true)\n\t\t);\n\t}\n\n\t/**\n\t * define a tint for this renderable. a (255, 255, 255) r, g, b value will remove the tint effect.\n\t * @type {Color}\n\t * @default (255, 255, 255)\n\t * @example\n\t * // add a red tint to this renderable\n\t * this.tint.setColor(255, 128, 128);\n\t * // remove the tint\n\t * this.tint.setColor(255, 255, 255);\n\t */\n\tget tint() {\n\t\treturn this._tint;\n\t}\n\tset tint(value) {\n\t\tthis._tint.copy(value);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * the depth of this renderable on the z axis\n\t * @type {number}\n\t */\n\tget depth() {\n\t\treturn this.pos.z;\n\t}\n\tset depth(value) {\n\t\tthis.pos.z = value;\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * Whether the renderable object is visible and within the viewport\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget inViewport() {\n\t\treturn this._inViewport;\n\t}\n\tset inViewport(value) {\n\t\tif (this._inViewport !== value) {\n\t\t\tthis._inViewport = value;\n\t\t\tif (typeof this.onVisibilityChange === \"function\") {\n\t\t\t\tthis.onVisibilityChange.call(this, value);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * returns true if this renderable is flipped on the horizontal axis\n\t * @public\n\t * @see Renderable#flipX\n\t * @type {boolean}\n\t */\n\tget isFlippedX() {\n\t\treturn this._flip.x === true;\n\t}\n\n\t/**\n\t * returns true if this renderable is flipped on the vertical axis\n\t * @public\n\t * @see Renderable#flipY\n\t * @type {boolean}\n\t */\n\tget isFlippedY() {\n\t\treturn this._flip.y === true;\n\t}\n\n\t/**\n\t * returns the bounding box for this renderable\n\t * @returns {Bounds} bounding box Rectangle object\n\t */\n\tgetBounds() {\n\t\tif (typeof this._bounds === \"undefined\") {\n\t\t\tsuper.getBounds();\n\t\t\tif (this.isFinite()) {\n\t\t\t\tthis.updateBounds();\n\t\t\t} else {\n\t\t\t\t// e.g. containers or game world can have infinite size\n\t\t\t\tthis._bounds.setMinMax(this.pos.x, this.pos.y, this.width, this.height);\n\t\t\t}\n\t\t}\n\t\treturn this._bounds;\n\t}\n\n\t/**\n\t * get the renderable alpha channel value<br>\n\t * @returns {number} current opacity value between 0 and 1\n\t */\n\tgetOpacity() {\n\t\treturn this.alpha;\n\t}\n\n\t/**\n\t * set the renderable alpha channel value<br>\n\t * @param {number} alpha - opacity value between 0.0 and 1.0\n\t */\n\tsetOpacity(alpha) {\n\t\tif (typeof alpha === \"number\") {\n\t\t\tthis.alpha = clamp(alpha, 0.0, 1.0);\n\t\t\t// Set to 1 if alpha is NaN\n\t\t\tif (isNaN(this.alpha)) {\n\t\t\t\tthis.alpha = 1.0;\n\t\t\t}\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * flip the renderable on the horizontal axis (around the center of the renderable)\n\t * @see Matrix2d#scaleX\n\t * @param {boolean} [flip=true] - `true` to flip this renderable.\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\tflipX(flip = true) {\n\t\tthis._flip.x = !!flip;\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * flip the renderable on the vertical axis (around the center of the renderable)\n\t * @see Matrix2d#scaleY\n\t * @param {boolean} [flip=true] - `true` to flip this renderable.\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\tflipY(flip = true) {\n\t\tthis._flip.y = !!flip;\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * multiply the renderable currentTransform with the given matrix\n\t * @see Renderable#currentTransform\n\t * @param {Matrix2d} m - the transformation matrix\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\ttransform(m) {\n\t\tthis.currentTransform.multiply(m);\n\t\tthis.updateBounds();\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * return the angle to the specified target\n\t * @param {Renderable|Vector2d|Vector3d} target\n\t * @returns {number} angle in radians\n\t */\n\tangleTo(target) {\n\t\tconst a = this.getBounds();\n\t\tlet ax;\n\t\tlet ay;\n\n\t\tif (target instanceof Renderable) {\n\t\t\tconst b = target.getBounds();\n\t\t\tax = b.centerX - a.centerX;\n\t\t\tay = b.centerY - a.centerY;\n\t\t} else {\n\t\t\t// vector object\n\t\t\tax = target.x - a.centerX;\n\t\t\tay = target.y - a.centerY;\n\t\t}\n\n\t\treturn Math.atan2(ay, ax);\n\t}\n\n\t/**\n\t * return the distance to the specified target\n\t * @param {Renderable|Vector2d|Vector3d} target\n\t * @returns {number} distance\n\t */\n\tdistanceTo(target) {\n\t\tconst a = this.getBounds();\n\t\tlet dx;\n\t\tlet dy;\n\n\t\tif (target instanceof Renderable) {\n\t\t\tconst b = target.getBounds();\n\t\t\tdx = a.centerX - b.centerX;\n\t\t\tdy = a.centerY - b.centerY;\n\t\t} else {\n\t\t\t// vector object\n\t\t\tdx = a.centerX - target.x;\n\t\t\tdy = a.centerY - target.y;\n\t\t}\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t/**\n\t * Rotate this renderable towards the given target.\n\t * @param {Renderable|Vector2d|Vector3d} target - the renderable or position to look at\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\tlookAt(target) {\n\t\tlet position;\n\n\t\tif (target instanceof Renderable) {\n\t\t\tposition = target.pos;\n\t\t} else {\n\t\t\tposition = target;\n\t\t}\n\n\t\tconst angle = this.angleTo(position);\n\n\t\tthis.rotate(angle);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Rotate this renderable by the specified angle (in radians).\n\t * @param {number} angle - The angle to rotate (in radians)\n\t * @param {Vector2d|ObservableVector2d} [v] - an optional point to rotate around\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\trotate(angle, v) {\n\t\tif (angle !== 0) {\n\t\t\tthis.currentTransform.rotate(angle, v);\n\t\t\tthis.updateBounds();\n\t\t\tthis.isDirty = true;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * scale the renderable around his anchor point. Scaling actually applies changes\n\t * to the currentTransform member which is used by the renderer to scale the object\n\t * when rendering. It does not scale the object itself. For example if the renderable\n\t * is an image, the image.width and image.height properties are unaltered but the currentTransform\n\t * member will be changed.\n\t * @param {number} x - a number representing the abscissa of the scaling vector.\n\t * @param {number} [y=x] - a number representing the ordinate of the scaling vector.\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\tscale(x, y = x) {\n\t\tthis.currentTransform.scale(x, y);\n\t\tthis.updateBounds();\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * scale the renderable around his anchor point\n\t * @param {Vector2d} v - scaling vector\n\t * @returns {Renderable} Reference to this object for method chaining\n\t */\n\tscaleV(v) {\n\t\tthis.scale(v.x, v.y);\n\t\treturn this;\n\t}\n\n\t/**\n\t * update function (automatically called by melonJS).\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean} true if the renderable is dirty\n\t */\n\t// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n\tupdate(dt) {\n\t\treturn this.isDirty;\n\t}\n\n\t/**\n\t * update the bounding box for this shape.\n\t * @param {boolean} [absolute=true] - update the bounds size and position in (world) absolute coordinates\n\t * @returns {Bounds} this shape bounding box Rectangle object\n\t */\n\tupdateBounds(absolute = true) {\n\t\tif (this.isRenderable) {\n\t\t\tconst bounds = this.getBounds();\n\n\t\t\tbounds.clear();\n\t\t\tif (this.autoTransform === true && !this.currentTransform.isIdentity()) {\n\t\t\t\t// temporarly translate the matrix based on the anchor point\n\t\t\t\tthis.currentTransform.translate(\n\t\t\t\t\t-this.width * this.anchorPoint.x,\n\t\t\t\t\t-this.height * this.anchorPoint.y,\n\t\t\t\t);\n\t\t\t\tbounds.addFrame(0, 0, this.width, this.height, this.currentTransform);\n\t\t\t\tthis.currentTransform.translate(\n\t\t\t\t\tthis.width * this.anchorPoint.x,\n\t\t\t\t\tthis.height * this.anchorPoint.y,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbounds.addFrame(0, 0, this.width, this.height);\n\t\t\t\t// translate the bounds based on the anchor point\n\t\t\t\tbounds.translate(\n\t\t\t\t\t-this.width * this.anchorPoint.x,\n\t\t\t\t\t-this.height * this.anchorPoint.y,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (absolute === true) {\n\t\t\t\tconst absPos = this.getAbsolutePosition();\n\t\t\t\tbounds.centerOn(\n\t\t\t\t\tabsPos.x + bounds.x + bounds.width / 2,\n\t\t\t\t\tabsPos.y + bounds.y + bounds.height / 2,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn bounds;\n\t\t} else {\n\t\t\t// manage the case where updateBounds is called\n\t\t\t// before the object being yet properly initialized\n\t\t\treturn super.updateBounds(absolute);\n\t\t}\n\t}\n\n\t/**\n\t * return the renderable absolute position in the game world\n\t * @returns {Vector2d}\n\t */\n\tgetAbsolutePosition() {\n\t\tif (typeof this._absPos === \"undefined\") {\n\t\t\tthis._absPos = vector2dPool.get();\n\t\t}\n\t\t// XXX Cache me or something\n\t\tthis._absPos.set(this.pos.x, this.pos.y);\n\t\tif (\n\t\t\ttypeof this.ancestor !== \"undefined\" &&\n\t\t\ttypeof this.ancestor.getAbsolutePosition === \"function\" &&\n\t\t\tthis.floating !== true\n\t\t) {\n\t\t\tthis._absPos.add(this.ancestor.getAbsolutePosition());\n\t\t}\n\t\treturn this._absPos;\n\t}\n\n\t/**\n\t * Prepare the rendering context before drawing (automatically called by melonJS).\n\t * This will apply any defined transforms, anchor point, tint or blend mode and translate the context accordingly to this renderable position.\n\t * @see Renderable#draw\n\t * @see Renderable#postDraw\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object\n\t */\n\tpreDraw(renderer) {\n\t\tconst ax = this.width * this.anchorPoint.x;\n\t\tconst ay = this.height * this.anchorPoint.y;\n\n\t\t// save renderer context\n\t\trenderer.save();\n\n\t\t// apply the defined alpha value\n\t\trenderer.setGlobalAlpha(renderer.globalAlpha() * this.getOpacity());\n\n\t\t// apply flip\n\t\tif (this._flip.x || this._flip.y) {\n\t\t\tconst dx = this._flip.x ? this.centerX - ax : 0;\n\t\t\tconst dy = this._flip.y ? this.centerY - ay : 0;\n\n\t\t\trenderer.translate(dx, dy);\n\t\t\trenderer.scale(this._flip.x ? -1 : 1, this._flip.y ? -1 : 1);\n\t\t\trenderer.translate(-dx, -dy);\n\t\t}\n\n\t\t// apply stencil mask if defined\n\t\tif (typeof this.mask !== \"undefined\") {\n\t\t\trenderer.translate(this.pos.x, this.pos.y);\n\t\t\trenderer.setMask(this.mask);\n\t\t\trenderer.translate(-this.pos.x, -this.pos.y);\n\t\t}\n\n\t\t// use this renderable shader if defined\n\t\tif (typeof this.shader === \"object\" && typeof renderer.gl !== \"undefined\") {\n\t\t\trenderer.customShader = this.shader;\n\t\t}\n\n\t\tif (this.autoTransform === true && !this.currentTransform.isIdentity()) {\n\t\t\t// apply the renderable transformation matrix\n\t\t\trenderer.translate(this.pos.x, this.pos.y);\n\t\t\trenderer.transform(this.currentTransform);\n\t\t\trenderer.translate(-this.pos.x, -this.pos.y);\n\t\t}\n\n\t\t// offset by the anchor point\n\t\trenderer.translate(-ax, -ay);\n\n\t\t// apply the current tint and opacity\n\t\trenderer.setTint(this.tint, this.getOpacity());\n\n\t\t// apply blending if different from \"normal\"\n\t\tif (this.blendMode !== renderer.getBlendMode()) {\n\t\t\trenderer.setBlendMode(this.blendMode);\n\t\t}\n\t}\n\n\t/**\n\t * Draw this renderable (automatically called by melonJS).\n\t * All draw operations for renderable are made respectively\n\t * to the position or transforms set or applied by the preDraw method.\n\t * The main draw loop will first call preDraw() to prepare the context for drawing the renderable,\n\t * then draw() to draw the renderable, and finally postDraw() to clear the context.\n\t * If you override this method, be mindful about the drawing logic; for example if you draw a shape\n\t * from the draw method, you should make sure that your draw it at the 0, 0 coordinates.\n\t * @see Renderable#preDraw\n\t * @see Renderable#postDraw\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\t// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n\tdraw(renderer, viewport) {\n\t\t// empty one !\n\t}\n\n\t/**\n\t * restore the rendering context after drawing (automatically called by melonJS).\n\t * @see Renderable#preDraw\n\t * @see Renderable#draw\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object\n\t */\n\tpostDraw(renderer) {\n\t\t// remove the previously applied tint\n\t\trenderer.clearTint();\n\n\t\t// clear the mask if set\n\t\tif (typeof this.mask !== \"undefined\") {\n\t\t\trenderer.clearMask();\n\t\t}\n\n\t\t// revert to the default shader if defined\n\t\tif (typeof this.shader === \"object\" && typeof renderer.gl !== \"undefined\") {\n\t\t\trenderer.customShader = undefined;\n\t\t\t//renderer.setCompositor(\"quad\");\n\t\t}\n\n\t\t// restore the context\n\t\trenderer.restore();\n\n\t\t// reset the dirty flag\n\t\tthis.isDirty = false;\n\t}\n\n\t/**\n\t * onCollision callback, triggered in case of collision,\n\t * when this renderable body is colliding with another one\n\t * @param {ResponseObject} response - the collision response object\n\t * @param {Renderable} other - the other renderable touching this one (a reference to response.a or response.b)\n\t * @returns {boolean} true if the object should respond to the collision (its position and velocity will be corrected)\n\t * @example\n\t * // colision handler\n\t * onCollision(response) {\n\t * if (response.b.body.collisionType === me.collision.types.ENEMY_OBJECT) {\n\t * // makes the other object solid, by substracting the overlap vector to the current position\n\t * this.pos.sub(response.overlapV);\n\t * this.hurt();\n\t * // not solid\n\t * return false;\n\t * }\n\t * // Make the object solid\n\t * return true;\n\t * },\n\t */\n\tonCollision() {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Destroy function<br>\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// allow recycling object properties\n\t\tmatrix2dPool.release(this.currentTransform);\n\t\tthis.currentTransform = undefined;\n\n\t\tthis.anchorPoint.revoke();\n\t\tthis.anchorPoint = undefined;\n\n\t\tthis.pos = undefined;\n\n\t\tif (typeof this._absPos !== \"undefined\") {\n\t\t\tvector2dPool.release(this._absPos);\n\t\t\tthis._absPos = undefined;\n\t\t}\n\n\t\tif (this._bounds instanceof Bounds) {\n\t\t\tboundsPool.release(this._bounds);\n\t\t\tthis._bounds = undefined;\n\t\t}\n\n\t\tthis.onVisibilityChange = undefined;\n\n\t\tif (typeof this.mask !== \"undefined\") {\n\t\t\tpool.push(this.mask);\n\t\t\tthis.mask = undefined;\n\t\t}\n\n\t\tif (this._tint instanceof Color) {\n\t\t\tcolorPool.release(this._tint);\n\t\t\tthis._tint = undefined;\n\t\t}\n\n\t\t// cannot import and reference a Container from a Renderable, since Container extends Renderable, creating a circular dependency\n\t\t//if (this.ancestor instanceof Container || this.ancestor instanceof Entity) {\n\t\tthis.ancestor = undefined;\n\n\t\t// cannot import and reference a Application from a Renderable, messsing up class order in the bundle\n\t\t//if (this._parentApp instanceof Application) {\n\t\tthis._parentApp = undefined;\n\t\t//}\n\n\t\t// destroy the physic body if a builtin body object\n\t\tif (this.body instanceof Body) {\n\t\t\tthis.body.destroy.apply(this.body, arguments);\n\t\t\tthis.body = undefined;\n\t\t}\n\n\t\t// release all registered events\n\t\treleaseAllPointerEvents(this);\n\n\t\t// call the user defined destroy method\n\t\tthis.onDestroyEvent.apply(this, arguments);\n\n\t\t// destroy any shader object if not done by the user through onDestroyEvent()\n\t\tif (this.shader instanceof GLShader) {\n\t\t\tthis.shader.destroy();\n\t\t\tthis.shader = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * OnDestroy Notification function<br>\n\t * Called by engine before deleting the object\n\t */\n\tonDestroyEvent() {\n\t\t// to be extended !\n\t}\n}\n", "import * as audio from \"./../audio/audio.js\";\nimport { warning } from \"../lang/console.js\";\nimport state from \"./../state/state.js\";\nimport {\n\teventEmitter,\n\tLOADER_COMPLETE,\n\tLOADER_ERROR,\n\tLOADER_PROGRESS,\n} from \"../system/event.ts\";\nimport { getBasename } from \"../utils/file.ts\";\nimport {\n\tbinList,\n\tfontList,\n\timgList,\n\tjsonList,\n\ttmxList,\n\tvideoList,\n} from \"./cache.js\";\nimport { preloadBinary } from \"./parsers/binary.js\";\nimport { preloadFontFace } from \"./parsers/fontface.js\";\nimport { preloadImage } from \"./parsers/image.js\";\nimport { preloadJSON } from \"./parsers/json.js\";\nimport { preloadJavascript } from \"./parsers/script.js\";\nimport { preloadTMX } from \"./parsers/tmx.js\";\nimport { preloadVideo } from \"./parsers/video.js\";\n\n/**\n * a small class to manage loading of stuff and manage resources\n * @namespace loader\n */\n\n// to enable/disable caching\nexport let nocache = \"\";\n\n/**\n * @type {Object.<string, string>}\n */\nexport const baseURL = {};\n\n/**\n * crossOrigin attribute to configure the CORS requests for Image and Video data element.\n * By default (that is, when the attribute is not specified), CORS is not used at all.\n * The \"anonymous\" keyword means that there will be no exchange of user credentials via cookies,\n * client-side SSL certificates or HTTP authentication as described in the Terminology section of the CORS specification.<br>\n * @type {string}\n * @name crossOrigin\n * @memberof loader\n * @default undefined\n * @see {@link setOptions}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}\n * @example\n * // allow for cross-origin texture loading\n * me.loader.crossOrigin = \"anonymous\";\n *\n * // set all ressources to be loaded\n * me.loader.preload(game.resources, () => this.loaded());\n */\nexport let crossOrigin;\n\n/**\n * indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies,\n * authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.\n * @public\n * @type {boolean}\n * @name withCredentials\n * @see {@link setOptions}\n * @default false\n * @memberof loader\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}\n * @example\n * // enable withCredentials\n * me.loader.withCredentials = true;\n *\n * // set all ressources to be loaded\n * me.loader.preload(game.resources, () => this.loaded());\n */\nexport let withCredentials = false;\n\n/**\n * enable the nocache mechanism\n * @ignore\n */\nexport function setNocache(enable = false) {\n\tnocache = enable ? \"?\" + ~~(Math.random() * 10000000) : \"\";\n}\n\n/**\n * Sets the options for the loader.\n * @memberof loader\n * @param {Object} options - The options to set.\n * @param {string} [options.crossOrigin] - The crossOrigin attribute to configure the CORS requests for Image and Video data element.\n * @param {boolean} [options.nocache] - Enable or disable the nocache mechanism.\n * @param {boolean} [options.withCredentials] - Indicates whether or not cross-site Access-Control requests should be made using credentials.\n * @example\n * // Set the crossOrigin attribute to \"anonymous\"\n * me.loader.setOptions({ crossOrigin: \"anonymous\" });\n *\n * // Enable the nocache mechanism\n * me.loader.setOptions({ nocache: true });\n *\n * // Enable withCredentials\n * me.loader.setOptions({ withCredentials: true });\n */\nexport function setOptions(options) {\n\tif (options.crossOrigin !== undefined) {\n\t\tcrossOrigin = options.crossOrigin;\n\t}\n\tif (options.nocache !== undefined) {\n\t\tsetNocache(options.nocache);\n\t}\n\tif (options.withCredentials !== undefined) {\n\t\twithCredentials = options.withCredentials;\n\t}\n}\n\n/**\n * change the default baseURL for the given asset type.<br>\n * (this will prepend the asset URL and must finish with a '/')\n * @name setBaseURL\n * @memberof loader\n * @public\n * @param {string} type - \"*\", \"audio\", \"video\", \"binary\", \"image\", \"json\", \"js\", \"tmx\", \"tsx\"\n * @param {string} [url=\"./\"] - default base URL\n * @example\n * // change the base URL relative address for audio assets\n * me.loader.setBaseURL(\"audio\", \"data/audio/\");\n * // change the base URL absolute address for all object types\n * me.loader.setBaseURL(\"*\", \"http://myurl.com/\")\n */\nexport function setBaseURL(type, url = \"./\") {\n\tif (type !== \"*\") {\n\t\tbaseURL[type] = url;\n\t} else {\n\t\t// \"wildcards\"\n\t\tbaseURL[\"audio\"] = url;\n\t\tbaseURL[\"video\"] = url;\n\t\tbaseURL[\"binary\"] = url;\n\t\tbaseURL[\"image\"] = url;\n\t\tbaseURL[\"json\"] = url;\n\t\tbaseURL[\"js\"] = url;\n\t\tbaseURL[\"tmx\"] = url;\n\t\tbaseURL[\"tsx\"] = url;\n\t\t// XXX ?\n\t\t//baseURL[\"fontface\"] = url;\n\t}\n}\n\n/**\n * onload callback\n * @default undefined\n * @memberof loader\n * @type {function}\n * @example\n * // set a callback when everything is loaded\n * me.loader.onload = this.loaded.bind(this);\n */\nexport let onload;\n\n/**\n * onProgress callback<br>\n * each time a resource is loaded, the loader will fire the specified function,\n * giving the actual progress [0 ... 1], as argument, and an object describing the resource loaded\n * @default undefined\n * @memberof loader\n * @type {function}\n * @example\n * // set a callback for progress notification\n * me.loader.onProgress = this.updateProgress.bind(this);\n */\nexport let onProgress;\n\n/**\n * onError callback<br>\n * each time a resource loading is failed, the loader will fire the specified function giving the actual asset as argument.\n * @default undefined\n * @memberof loader\n * @type {function}\n * @example\n * // set a callback for error notification\n * me.loader.onError = this.loaderError.bind(this);\n */\nexport let onError;\n\n/**\n * list of parser function for supported format type\n */\nconst parsers = new Map();\n\n/**\n * keep track if parsers were registered\n */\nlet parserInitialized = false;\n\n// flag to check loading status\nlet resourceCount = 0;\nlet loadCount = 0;\nlet timerId = 0;\n\n/**\n * Assets uploaded with an error\n */\nconst failureLoadedAssets = {};\n\n/**\n * init all supported parsers\n * @ignore\n */\nfunction initParsers() {\n\tsetParser(\"binary\", preloadBinary);\n\tsetParser(\"image\", preloadImage);\n\tsetParser(\"json\", preloadJSON);\n\tsetParser(\"js\", preloadJavascript);\n\tsetParser(\"tmx\", preloadTMX);\n\tsetParser(\"tsx\", preloadTMX);\n\tsetParser(\"audio\", audio.load);\n\tsetParser(\"fontface\", preloadFontFace);\n\tsetParser(\"video\", preloadVideo);\n\tparserInitialized = true;\n}\n\n/**\n * check the loading status\n * @ignore\n */\nfunction checkLoadStatus(onloadcb) {\n\tif (loadCount === resourceCount) {\n\t\t// wait 1/2s and execute callback (cheap workaround to ensure everything is loaded)\n\t\tif (typeof onloadcb === \"function\" || onload) {\n\t\t\t// make sure we clear the timer\n\t\t\tclearTimeout(timerId);\n\t\t\t// trigger the onload callback\n\t\t\t// we call either the supplied callback (which takes precedence) or the global one\n\t\t\tconst callback = onloadcb || onload;\n\t\t\tsetTimeout(() => {\n\t\t\t\tcallback();\n\t\t\t\teventEmitter.emit(LOADER_COMPLETE);\n\t\t\t}, 300);\n\t\t} else {\n\t\t\tthrow new Error(\"no load callback defined\");\n\t\t}\n\t} else {\n\t\ttimerId = setTimeout(() => {\n\t\t\tcheckLoadStatus(onloadcb);\n\t\t}, 100);\n\t}\n}\n\n/**\n * just increment the number of already loaded resources\n * @ignore\n */\nfunction onResourceLoaded(res) {\n\tdelete failureLoadedAssets[res.src];\n\t// increment the loading counter\n\tloadCount++;\n\n\t// currrent progress\n\tconst progress = loadCount / resourceCount;\n\n\t// call callback if defined\n\tif (typeof onProgress === \"function\") {\n\t\t// pass the load progress in percent, as parameter\n\t\tonProgress(progress, res);\n\t}\n\teventEmitter.emit(LOADER_PROGRESS, progress, res);\n}\n\n/**\n * on error callback for image loading\n * @param {Asset} asset - asset that loaded with failure\n * @ignore\n */\nfunction onLoadingError(res) {\n\tfailureLoadedAssets[res.src] = res;\n\tif (this.onError) {\n\t\tthis.onError(res);\n\t}\n\teventEmitter.emit(LOADER_ERROR, res);\n\tthrow new Error(\"Failed loading resource \" + res.src);\n}\n\n/**\n * an asset definition to be used with the loader\n * @typedef {object} Asset\n * @memberof loader\n * @property {string} name - name of the asset\n * @property {string} type - the type of the asset (\"audio\"|\"binary\"|\"image\"|\"json\"|\"js\"|\"tmx\"|\"tmj\"|\"tsx\"|\"tsj\"|\"fontface\"|\"video\")\n * @property {string} [src] - path and/or file name of the resource (for audio assets only the path is required)\n * @property {string} [data] - TMX data if not provided through a src url\n * @property {boolean} [stream=false] - Set to true to not to wait for large audio or video file to be downloaded before playing.\n * @property {boolean} [autoplay=false] - Set to true to automatically start playing audio or video when loaded or added to a scene (using autoplay might require user iteraction to enable it)\n * @property {boolean} [loop=false] - Set to true to automatically loop the audio or video when playing\n * @see {@link preload}\n * @see {@link load}\n * @example\n * // PNG tileset\n * {name: \"tileset-platformer\", type: \"image\", src: \"data/map/tileset.png\"}\n * // PNG packed texture\n * {name: \"texture\", type:\"image\", src: \"data/gfx/texture.png\"}\n * // PNG base64 encoded image\n * {name: \"texture\", type:\"image\", src: \"data:image/png;base64,iVBORw0KAAAQAAAAEACA...\"}\n * // TSX file\n * {name: \"meta_tiles\", type: \"tsx\", src: \"data/map/meta_tiles.tsx\"}\n * // TMX level (XML & JSON)\n * {name: \"map1\", type: \"tmx\", src: \"data/map/map1.json\"}\n * {name: \"map2\", type: \"tmx\", src: \"data/map/map2.tmx\"}\n * {name: \"map3\", type: \"tmx\", format: \"json\", data: {\"height\":15,\"layers\":[...],\"tilewidth\":32,\"version\":1,\"width\":20}}\n * {name: \"map4\", type: \"tmx\", format: \"xml\", data: {xml representation of tmx}}\n * // audio resources\n * {name: \"bgmusic\", type: \"audio\", src: \"data/audio/\"}\n * {name: \"cling\", type: \"audio\", src: \"data/audio/\"}\n * // base64 encoded audio resources\n * {name: \"band\", type: \"audio\", src: \"data:audio/wav;base64,...\"}\n * // binary file\n * {name: \"ymTrack\", type: \"binary\", src: \"data/audio/main.ym\"}\n * // JSON file (used for texturePacker)\n * {name: \"texture\", type: \"json\", src: \"data/gfx/texture.json\"}\n * // JavaScript file\n * {name: \"plugin\", type: \"js\", src: \"data/js/plugin.js\"}\n * // Font Face\n * { name: \"'kenpixel'\", type: \"fontface\", src: \"url('data/font/kenvector_future.woff2')\" }\n * // video resources\n * {name: \"intro\", type: \"video\", src: \"data/video/\"}\n */\n\n/**\n * specify a parser/preload function for the given asset type\n * @memberof loader\n * @param {string} type - asset type\n * @param {function} parserFn - parser function\n * @see {@link Asset.type}\n * @example\n * // specify a custom function for \"abc\" format\n * function customAbcParser(data, onload, onerror) {\n * // preload and do something with the data\n * let parsedData = doSomething(data);\n * // when done, call the onload callback with the parsed data\n * onload(parsedData);\n * // in case of error, call the onerror callback\n * onerror();\n * // return the amount of asset parsed\n * return 1\n * }\n * // set the parser for the custom format\n * loader.setParser(\"abc\", customAbcParser);\n */\nexport function setParser(type, parserFn) {\n\tif (typeof parserFn !== \"function\") {\n\t\tthrow new Error(\"invalid parser function for \" + type);\n\t}\n\n\tif (typeof parsers.get(type) !== \"undefined\") {\n\t\twarning(\"overriding parser for \" + type + \" format\");\n\t}\n\n\tparsers.set(type, parserFn);\n}\n\n/**\n * set all the specified game assets to be preloaded.\n * @memberof loader\n * @param {Asset[]} assets - list of assets to load\n * @param {Function} [onloadcb=loader.onload] - function to be called when all resources are loaded\n * @param {boolean} [switchToLoadState=true] - automatically switch to the loading screen\n * @example\n * game.assets = [\n * // PNG tileset\n * {name: \"tileset-platformer\", type: \"image\", src: \"data/map/tileset.png\"},\n * // PNG packed texture\n * {name: \"texture\", type:\"image\", src: \"data/gfx/texture.png\"}\n * // PNG base64 encoded image\n * {name: \"texture\", type:\"image\", src: \"data:image/png;base64,iVBORw0KAAAQAAAAEACA...\"}\n * // TSX file\n * {name: \"meta_tiles\", type: \"tsx\", src: \"data/map/meta_tiles.tsx\"},\n * // TMX level (XML & JSON)\n * {name: \"map1\", type: \"tmx\", src: \"data/map/map1.json\"},\n * {name: \"map2\", type: \"tmx\", src: \"data/map/map2.tmx\"},\n * {name: \"map3\", type: \"tmx\", format: \"json\", data: {\"height\":15,\"layers\":[...],\"tilewidth\":32,\"version\":1,\"width\":20}},\n * {name: \"map4\", type: \"tmx\", format: \"xml\", data: {xml representation of tmx}},\n * // audio resources\n * {name: \"bgmusic\", type: \"audio\", src: \"data/audio/\"},\n * {name: \"cling\", type: \"audio\", src: \"data/audio/\"},\n * // base64 encoded audio resources\n * {name: \"band\", type: \"audio\", src: \"data:audio/wav;base64,...\"},\n * // binary file\n * {name: \"ymTrack\", type: \"binary\", src: \"data/audio/main.ym\"},\n * // JSON file (used for texturePacker)\n * {name: \"texture\", type: \"json\", src: \"data/gfx/texture.json\"},\n * // JavaScript file\n * {name: \"plugin\", type: \"js\", src: \"data/js/plugin.js\"},\n * // Font Face\n * {name: \"'kenpixel'\", type: \"fontface\", src: \"url('data/font/kenvector_future.woff2')\"},\n * // video resources\n * {name: \"intro\", type: \"video\", src: \"data/video/\"},\n * // base64 encoded video asset\n * me.loader.load({name: \"avatar\", type:\"video\", src: \"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZ...\"};\n * ];\n * ...\n * // set all resources to be loaded\n * me.loader.preload(game.assets, () => this.loaded());\n */\nexport function preload(assets, onloadcb, switchToLoadState = true) {\n\t// parse the resources\n\tfor (let i = 0; i < assets.length; i++) {\n\t\tresourceCount += load(\n\t\t\tassets[i],\n\t\t\tonResourceLoaded.bind(this, assets[i]),\n\t\t\tonLoadingError.bind(this, assets[i]),\n\t\t);\n\t}\n\t// set the onload callback if defined\n\tif (typeof onloadcb !== \"undefined\") {\n\t\tonload = onloadcb;\n\t}\n\n\tif (switchToLoadState === true) {\n\t\t// swith to the loading screen\n\t\tstate.change(state.LOADING);\n\t}\n\n\t// check load status\n\tcheckLoadStatus(onload);\n}\n\n/**\n * retry loading assets after a loading failure\n * @memberof loader\n * @param {string} src - src of asset to reload\n * @example\n * event.on(\n * event.LOADER_ERROR,\n * (res) => {\n * // custom function\n * showErrorNotification({\n * text: `Error during loading content: ${res.name}`,\n * done: loader.reload(res.src);\n * })\n * }\n * );\n **/\nexport function reload(src) {\n\tconst assetToReload = failureLoadedAssets[src];\n\tthis.unload(assetToReload);\n\tresourceCount -= 1;\n\tresourceCount += this.load(\n\t\tassetToReload,\n\t\tthis.onResourceLoaded.bind(this, assetToReload),\n\t\tthis.onLoadingError.bind(this, assetToReload),\n\t);\n\t// check load status\n\tcheckLoadStatus(this.onload);\n}\n\n/**\n * Load a single asset (to be used if you need to load additional asset(s) during the game)\n * @memberof loader\n * @param {Asset} asset\n * @param {Function} [onload] - function to be called when the asset is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @returns {number} the amount of corresponding resource to be preloaded\n * @example\n * // load an image asset\n * me.loader.load({name: \"avatar\", type:\"image\", src: \"data/avatar.png\"}, () => this.onload(), () => this.onerror());\n * // load a base64 image asset\n * me.loader.load({name: \"avatar\", type:\"image\", src: \"data:image/png;base64,iVBORw0KAAAQAAAAEACA...\"};\n * // load a base64 video asset\n * me.loader.load({\n * name: \"avatar\",\n * type:\"video\",\n * src: \"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZ..\"\n * };\n * // start loading music\n * me.loader.load({\n * name : \"bgmusic\",\n * type : \"audio\",\n * src : \"data/audio/\"\n * }, function () {\n * me.audio.play(\"bgmusic\");\n * });\n */\nexport function load(asset, onload, onerror) {\n\t// make sure all parsers have been initialized\n\tif (parserInitialized === false) {\n\t\tinitParsers();\n\t}\n\n\t// transform the url if necessary\n\tif (typeof baseURL[asset.type] !== \"undefined\") {\n\t\tasset.src = baseURL[asset.type] + asset.src;\n\t}\n\n\tconst parser = parsers.get(asset.type);\n\n\tif (typeof parser === \"undefined\") {\n\t\tthrow new Error(\"load : unknown or invalid resource type : \" + asset.type);\n\t}\n\n\t// parser returns the amount of asset to be loaded (usually 1 unless an asset is splitted into several ones)\n\treturn parser.call(this, asset, onload, onerror, {\n\t\tnocache: nocache,\n\t\tcrossOrigin: crossOrigin,\n\t\twithCredentials: withCredentials,\n\t});\n}\n\n/**\n * unload the specified asset to free memory\n * @memberof loader\n * @param {Asset} asset\n * @returns {boolean} true if unloaded\n * @example me.loader.unload({name: \"avatar\", type:\"image\"});\n */\nexport function unload(asset) {\n\tswitch (asset.type) {\n\t\tcase \"binary\":\n\t\t\tif (!(asset.name in binList)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tdelete binList[asset.name];\n\t\t\treturn true;\n\n\t\tcase \"image\":\n\t\t\tif (!(asset.name in imgList)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdelete imgList[asset.name];\n\t\t\treturn true;\n\n\t\tcase \"json\":\n\t\t\tif (!(asset.name in jsonList)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tdelete jsonList[asset.name];\n\t\t\treturn true;\n\n\t\tcase \"js\":\n\t\t\t// ??\n\t\t\treturn true;\n\n\t\tcase \"fontface\":\n\t\t\tif (\n\t\t\t\ttypeof typeof globalThis.document !== \"undefined\" &&\n\t\t\t\ttypeof globalThis.document.fonts !== \"undefined\"\n\t\t\t) {\n\t\t\t\tglobalThis.document.fonts.delete(fontList[asset.name]);\n\t\t\t\tdelete fontList[asset.name];\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"tmx\":\n\t\tcase \"tsx\":\n\t\t\tif (!(asset.name in tmxList)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tdelete tmxList[asset.name];\n\t\t\treturn true;\n\n\t\tcase \"audio\":\n\t\t\treturn audio.unload(asset.name);\n\n\t\tcase \"video\":\n\t\t\tif (!(asset.name in videoList)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tdelete videoList[asset.name];\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t\"unload : unknown or invalid resource type : \" + asset.type,\n\t\t\t);\n\t}\n}\n\n/**\n * unload all resources to free memory\n * @memberof loader\n * @example me.loader.unloadAll();\n */\nexport function unloadAll() {\n\tlet name;\n\n\t// unload all binary resources\n\tfor (name in binList) {\n\t\tif (binList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"binary\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all image resources\n\tfor (name in imgList) {\n\t\tif (imgList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"image\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all tmx resources\n\tfor (name in tmxList) {\n\t\tif (tmxList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"tmx\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all json resources\n\tfor (name in jsonList) {\n\t\tif (jsonList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"json\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all video resources\n\tfor (name in videoList) {\n\t\tif (videoList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"json\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all video resources\n\tfor (name in fontList) {\n\t\tif (fontList.hasOwnProperty(name)) {\n\t\t\tunload({\n\t\t\t\tname: name,\n\t\t\t\ttype: \"font\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// unload all audio resources\n\taudio.unloadAll();\n}\n\n/**\n * return the specified TMX/TSX object\n * @memberof loader\n * @param {string} elt - name of the tmx/tsx element (\"map1\");\n * @returns {object} requested element or null if not found\n */\nexport function getTMX(elt) {\n\t// force as string\n\telt = \"\" + elt;\n\tif (elt in tmxList) {\n\t\treturn tmxList[elt];\n\t}\n\treturn null;\n}\n\n/**\n * return the specified Binary object\n * @memberof loader\n * @param {string} elt - name of the binary object (\"ymTrack\");\n * @returns {object} requested element or null if not found\n */\nexport function getBinary(elt) {\n\t// force as string\n\telt = \"\" + elt;\n\tif (elt in binList) {\n\t\treturn binList[elt];\n\t}\n\treturn null;\n}\n\n/**\n * return the specified Image Object\n * @memberof loader\n * @param {string} image - name of the Image element (\"tileset-platformer\");\n * @returns {HTMLImageElement} requested element or null if not found\n */\nexport function getImage(image) {\n\t// force as string and extract the base name\n\timage = getBasename(\"\" + image);\n\tif (image in imgList) {\n\t\t// return the corresponding Image object\n\t\treturn imgList[image];\n\t}\n\treturn null;\n}\n\n/**\n * return the specified JSON Object\n * @memberof loader\n * @param {string} elt - name of the json file\n * @returns {JSON}\n */\nexport function getJSON(elt) {\n\t// force as string\n\telt = \"\" + elt;\n\tif (elt in jsonList) {\n\t\treturn jsonList[elt];\n\t}\n\treturn null;\n}\n\n/**\n * return the specified Video Object\n * @memberof loader\n * @param {string} elt - name of the video file\n * @returns {HTMLVideoElement}\n */\nexport function getVideo(elt) {\n\t// force as string\n\telt = \"\" + elt;\n\tif (elt in videoList) {\n\t\treturn videoList[elt];\n\t}\n\treturn null;\n}\n\n/**\n * return the specified FontFace Object\n * @memberof loader\n * @param {string} elt - name of the font file\n * @returns {FontFace}\n */\nexport function getFont(elt) {\n\t// force as string\n\telt = \"\" + elt;\n\tif (elt in fontList) {\n\t\treturn fontList[elt];\n\t}\n\treturn null;\n}\n", "/**\n * display a deprecation warning in the console\n * @param {string} deprecated - deprecated class,function or property name\n * @param {string} replacement - the replacement class, function, or property name\n * @param {string} version - the version since when the lass,function or property is deprecated\n */\nexport function warning(deprecated, replacement, version) {\n\tif (\"__vitest_browser__\" in window) {\n\t\treturn;\n\t}\n\tconst msg = \"melonJS: %s is deprecated since version %s, please use %s\";\n\tconst stack = new Error().stack;\n\n\tif (console.groupCollapsed) {\n\t\tconsole.groupCollapsed(\n\t\t\t\"%c\" + msg,\n\t\t\t\"font-weight:normal;color:yellow;\",\n\t\t\tdeprecated,\n\t\t\tversion,\n\t\t\treplacement,\n\t\t);\n\t} else {\n\t\tconsole.warn(msg, deprecated, version, replacement);\n\t}\n\n\tif (typeof stack !== \"undefined\") {\n\t\tconsole.warn(stack);\n\t}\n\n\tif (console.groupCollapsed) {\n\t\tconsole.groupEnd();\n\t}\n}\n", "/**\n * where all preloaded content is cached\n */\n\n// contains all the images loaded\nexport const imgList = {};\n\n// contains all the TMX loaded\nexport const tmxList = {};\n\n// contains all the binary files loaded\nexport const binList = {};\n\n// contains all the JSON files\nexport const jsonList = {};\n\n// contains all the video files\nexport const videoList = {};\n\n// contains all the font files\nexport const fontList = {};\n", "/**\n * Fetches data from the specified URL.\n * @param {string} url - The URL to fetch the data from.\n * @param {string} responseType - The type of response expected ('json', 'text', 'blob', 'arrayBuffer').\n * @param {Object} [settings] - custom settings to apply to the request (@link https://developer.mozilla.org/en-US/docs/Web/API/fetch#options)\n * @returns {Promise} A promise that resolves with the fetched data or rejects with an error.\n * @ignore\n * @example\n * fetchData('https://api.example.com/data', 'json')\n * .then(data => {\n * // Handle the fetched JSON data\n * })\n * .catch(error => {\n * // Handle the error\n * });\n */\nexport function fetchData(url, responseType, settings = {}) {\n\treturn new Promise((resolve, reject) => {\n\t\tfetch(url, {\n\t\t\tmethod: \"GET\",\n\t\t\t// internally nocache is a string with a generated random number\n\t\t\tcache: settings.nocache === \"\" ? \"no-cache\" : \"reload\",\n\t\t\tcredentials: settings.withCredentials === true ? \"include\" : \"omit\",\n\t\t\t// see setting.crossorigin, \"anonymous\" is used for cross-origin requests\n\t\t\tmode: settings.crossOrigin === \"anonymous\" ? \"cors\" : \"no-cors\",\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\t// status = 0 when file protocol is used, or cross-domain origin\n\t\t\t\t\tif (response.status !== 0) {\n\t\t\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\"`Network response was not ok ${response.statusText}`\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (responseType) {\n\t\t\t\t\tcase \"json\":\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\treturn response.text();\n\t\t\t\t\tcase \"blob\":\n\t\t\t\t\t\treturn response.blob();\n\t\t\t\t\tcase \"arrayBuffer\":\n\t\t\t\t\t\treturn response.arrayBuffer();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treject(new Error(\"Invalid response type\"));\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((data) => {\n\t\t\t\treturn resolve(data);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\treturn reject(error);\n\t\t\t});\n\t});\n}\n", "import { binList } from \"../cache.js\";\nimport { fetchData } from \"./fetchdata.js\";\n\n/**\n * parse/preload a Binary file\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the asset is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n */\nexport function preloadBinary(data, onload, onerror, settings) {\n\tfetchData(data.src, \"arrayBuffer\", settings)\n\t\t.then((response) => {\n\t\t\t// this method is native and might be slightly more efficient\n\t\t\tconst decoder = new TextDecoder(); // the default for this is 'utf-8'\n\t\t\tbinList[data.name] = decoder.decode(response);\n\n\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t// callback\n\t\t\t\tonload();\n\t\t\t}\n\t\t})\n\t\t.catch((error) => {\n\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\tonerror(error);\n\t\t\t}\n\t\t});\n\n\treturn 1;\n}\n", "import { isDataUrl } from \"../../utils/string.ts\";\nimport { fontList } from \"../cache.js\";\n\n/**\n * parse/preload a font face\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the asset is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n * @example\n * preloadFontFace(\n * name: \"'kenpixel'\", type: \"fontface\", src: \"url('data/font/kenvector_future.woff2')\"\n * ]);\n */\nexport function preloadFontFace(data, onload, onerror) {\n\tconst fontFaceSet =\n\t\ttypeof globalThis.document !== \"undefined\"\n\t\t\t? globalThis.document.fonts\n\t\t\t: undefined;\n\n\tif (isDataUrl(data.src) === true) {\n\t\t// make sure it in the `url(data:[<mediatype>][;base64],<data>)` format as expected by FontFace\n\t\tif (!data.src.startsWith(\"url(\")) {\n\t\t\tdata.src = \"url(\" + data.src + \")\";\n\t\t}\n\t}\n\n\tif (typeof fontFaceSet !== \"undefined\") {\n\t\t// create a new font face\n\t\tconst font = new FontFace(data.name, data.src);\n\t\t// loading promise\n\t\tfont.load().then(\n\t\t\t() => {\n\t\t\t\t// add the font to the cache\n\t\t\t\tfontList[data.name] = font;\n\t\t\t\t// add the font to the document\n\t\t\t\tfontFaceSet.add(font);\n\t\t\t\t// onloaded callback\n\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\tonload();\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\t// rejected\n\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\tonerror(data.name);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t} else {\n\t\tif (typeof onerror === \"function\") {\n\t\t\tonerror();\n\t\t}\n\t}\n\n\treturn 1;\n}\n", "// parse and return the compressed texture\nexport function parseDDS(/*data, formats*/) {\n\tthrow new Error(\"unsupported format\");\n}\n", "// parse and return the compressed texture\nexport function parseKTX(/*data, formats*/) {\n\tthrow new Error(\"unsupported format\");\n}\n", "// parse and return the compressed texture\nexport function parseKTX2(/*data, formats*/) {\n\tthrow new Error(\"unsupported format\");\n}\n", "// parse and return the compressed texture\nexport function parsePKM(/*data, formats*/) {\n\tthrow new Error(\"unsupported format\");\n}\n", "/*\nconst COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;\nconst COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;\nconst COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;\nconst COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;\n\nconst COMPRESSED_RGB_ETC1_WEBGL = 0x8D64;\n\nconst PVR_HEADER_LENGTH = 13; // The header length in 32 bit ints.\n//const PVR_MAGIC = 0x03525650; //0x50565203;\n\n// Offsets into the header array.\n//const PVR_HEADER_MAGIC = 0;\nconst PVR_HEADER_FORMAT = 2;\nconst PVR_HEADER_HEIGHT = 6;\nconst PVR_HEADER_WIDTH = 7;\nconst PVR_HEADER_MIPMAPCOUNT = 11;\nconst PVR_HEADER_METADATA = 12;\n\nconst PVR_FORMAT_2BPP_RGB = 0;\nconst PVR_FORMAT_2BPP_RGBA = 1;\nconst PVR_FORMAT_4BPP_RGB = 2;\nconst PVR_FORMAT_4BPP_RGBA = 3;\n//const PVR_COLOR_SPACE = 4;\nconst PVR_FORMAT_ETC1 = 6;\nconst PVR_FORMAT_DXT1 = 7;\nconst PVR_FORMAT_DXT3 = 9;\nconst PVR_FORMAT_DXT5 = 5;\n\nconst COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;\n//const COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;\nconst COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;\nconst COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;\n\nconst PVR_TO_WEBGL_FORMAT = {\n [PVR_FORMAT_2BPP_RGB] : COMPRESSED_RGB_PVRTC_2BPPV1_IMG,\n [PVR_FORMAT_2BPP_RGBA] : COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,\n [PVR_FORMAT_4BPP_RGB] : COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n [PVR_FORMAT_4BPP_RGBA] : COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n [PVR_FORMAT_ETC1] : COMPRESSED_RGB_ETC1_WEBGL,\n [PVR_FORMAT_DXT1] : COMPRESSED_RGB_S3TC_DXT1_EXT,\n [PVR_FORMAT_DXT3] : COMPRESSED_RGBA_S3TC_DXT3_EXT,\n [PVR_FORMAT_DXT5] : COMPRESSED_RGBA_S3TC_DXT5_EXT\n};\n\nfunction levelBufferSize(format, width, height) {\n switch (format) {\n case COMPRESSED_RGB_S3TC_DXT1_EXT:\n case COMPRESSED_RGB_ETC1_WEBGL:\n return ((width + 3) >> 2) * ((height + 3) >> 2) * 8;\n\n case COMPRESSED_RGBA_S3TC_DXT3_EXT:\n case COMPRESSED_RGBA_S3TC_DXT5_EXT:\n return ((width + 3) >> 2) * ((height + 3) >> 2) * 16;\n\n case COMPRESSED_RGB_PVRTC_4BPPV1_IMG:\n case COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:\n return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8);\n\n case COMPRESSED_RGB_PVRTC_2BPPV1_IMG:\n case COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:\n return Math.floor((Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8);\n\n default:\n return 0;\n }\n}\n*/\n\n// parse and return the compressed texture\nexport function parsePVR() {\n\tthrow new Error(\"unsupported format\");\n\n\t/*\n\n // Create a new DataView from the data\n let header = new Uint32Array(data, 0, PVR_HEADER_LENGTH);\n\n //console.log(header);\n\n // VERSION\n //const version = header[PVR_HEADER_FORMAT];\n //const versionMatch = version === PVR_MAGIC;\n\n // PIXEL_FORMAT_INDEX\n const pvrFormat = PVR_TO_WEBGL_FORMAT[header[PVR_HEADER_FORMAT]] || -1;\n const width = header[PVR_HEADER_WIDTH];\n const height = header[PVR_HEADER_HEIGHT];\n const dataOffset = header[PVR_HEADER_METADATA] + 52;\n //const colorSpace = header[PVR_COLOR_SPACE];\n const mipmapCount = header[PVR_HEADER_MIPMAPCOUNT];\n\n var image = new Uint8Array(data, dataOffset);\n var mipmaps = new Array(mipmapCount);\n\n var offset = 0;\n var levelWidth = width;\n var levelHeight = height;\n\n for (var i = 0; i < mipmapCount; i++)\n {\n var levelSize = levelBufferSize(pvrFormat, levelWidth, levelHeight);\n\n mipmaps[i] = {\n data: new Uint8Array(image.buffer, image.byteOffset + offset, levelSize),\n width: levelWidth,\n height: levelHeight\n };\n\n levelWidth = Math.max(1, levelWidth >> 1);\n levelHeight = Math.max(1, levelHeight >> 1);\n\n offset += levelSize;\n }\n\n return {\n mipmaps: mipmaps,\n width: width,\n height: height,\n format: pvrFormat,\n compressed: true,\n generateMipmap: false\n };\n\n */\n}\n", "import { eventEmitter, VIDEO_INIT } from \"../../../system/event.ts\";\nimport { parseDDS } from \"./parseDDS.js\";\nimport { parseKTX } from \"./parseKTX.js\";\nimport { parseKTX2 } from \"./parseKTX2.js\";\nimport { parsePKM } from \"./parsePKM.js\";\nimport { parsePVR } from \"./parsePVR.js\";\n\nlet _renderer;\n\n// gracefully capture a reference to the active renderer without adding more cyclic redundancy\neventEmitter.addListenerOnce(VIDEO_INIT, (renderer) => {\n\t_renderer = renderer;\n});\n\nexport function parseCompressedImage(arrayBuffer, imgExt) {\n\tlet texture;\n\n\t// check if the current renderer is WebGL\n\tif (_renderer.type.includes(\"WebGL\")) {\n\t\tswitch (imgExt) {\n\t\t\t// Compressed texture\n\t\t\tcase \"dds\":\n\t\t\t\ttexture = parseDDS(arrayBuffer);\n\t\t\t\tbreak;\n\t\t\tcase \"pvr\":\n\t\t\t\ttexture = parsePVR(arrayBuffer);\n\t\t\t\tbreak;\n\t\t\tcase \"pkm\":\n\t\t\t\ttexture = parsePKM(arrayBuffer);\n\t\t\t\tbreak;\n\t\t\tcase \"ktx\":\n\t\t\t\ttexture = parseKTX(arrayBuffer);\n\t\t\t\tbreak;\n\t\t\tcase \"ktx2\":\n\t\t\t\ttexture = parseKTX2(arrayBuffer);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (typeof texture !== \"undefined\") {\n\t\tif (_renderer.hasSupportedCompressedFormats(texture.format)) {\n\t\t\tconsole.log(\"Compressed texture format supported: \" + texture.format);\n\t\t\treturn texture;\n\t\t}\n\t}\n\n\tthrow \"unsupported texture format:\" + imgExt + texture\n\t\t? \" (\" + texture.format + \")\"\n\t\t: \"\";\n}\n", "import { getExtension } from \"../../utils/file.ts\";\nimport { imgList } from \"../cache.js\";\nimport { parseCompressedImage } from \"./compressed_textures/compressed_image.js\";\nimport { fetchData } from \"./fetchdata.js\";\n\n/**\n * parse/preload an image\n * @param {loader.Asset} img\n * @param {Function} [onload] - function to be called when the resource is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n * @example\n * preloadImages([\n * { name : 'image1', src : 'images/image1.png'},\n * { name : 'image2', src : 'images/image2.png'},\n * { name : 'image3', src : 'images/image3.png'},\n * { name : 'image4', src : 'images/image4.png'}\n * ]);\n */\nexport function preloadImage(img, onload, onerror, settings) {\n\tif (typeof imgList[img.name] !== \"undefined\") {\n\t\t// already loaded\n\t\treturn 0;\n\t}\n\n\tconst sources = Array.isArray(img.src) ? img.src : [img.src];\n\tlet isFormatSupported = false;\n\n\tfor (const imgPath of sources) {\n\t\tconst imgExt = getExtension(imgPath);\n\t\t// loop will stop as soon as a first supported format is detected\n\t\tswitch (imgExt) {\n\t\t\t// Compressed texture\n\t\t\tcase \"dds\":\n\t\t\tcase \"pvr\":\n\t\t\tcase \"pkm\":\n\t\t\tcase \"ktx\":\n\t\t\tcase \"ktx2\":\n\t\t\t\tfetchData(imgPath, \"arrayBuffer\", settings)\n\t\t\t\t\t.then((arrayBuffer) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\timgList[img.name] = parseCompressedImage(arrayBuffer, imgExt);\n\t\t\t\t\t\t\tisFormatSupported = true;\n\t\t\t\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\t\t\t\t// callback\n\t\t\t\t\t\t\t\tonload();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// parseCompressedImage will throw an error if a format is not supported or badly formatted\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\t\t\t// file cannot be loaded\n\t\t\t\t\t\t\tonerror(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\t// SVG file\n\t\t\tcase \"svg\":\n\t\t\t\tfetchData(imgPath, \"text\", settings)\n\t\t\t\t\t.then((svgText) => {\n\t\t\t\t\t\tconst svgImage = new Image();\n\t\t\t\t\t\tsvgImage.onload = function () {\n\t\t\t\t\t\t\timgList[img.name] = svgImage;\n\t\t\t\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\t\t\t\t// callback\n\t\t\t\t\t\t\t\tonload();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsvgImage.onerror = function (error) {\n\t\t\t\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\t\t\t\tonerror(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsvgImage.src =\n\t\t\t\t\t\t\t\"data:image/svg+xml;charset=utf8,\" + encodeURIComponent(svgText);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\t\t\tonerror(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tisFormatSupported = true;\n\t\t\t\tbreak;\n\n\t\t\t// default is regular images (jpg, png and friends)\n\t\t\tdefault:\n\t\t\t\tfetchData(imgPath, \"blob\", settings)\n\t\t\t\t\t.then((blob) => {\n\t\t\t\t\t\tglobalThis.createImageBitmap(blob).then((bitmap) => {\n\t\t\t\t\t\t\timgList[img.name] = bitmap;\n\t\t\t\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\t\t\t\t// callback\n\t\t\t\t\t\t\t\tonload();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\t\t\tonerror(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tisFormatSupported = true;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// exit the loop as soon as the first supported format is detected\n\t\tif (isFormatSupported === true) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\t// no compatible format was found\n\tthrow new Error(\"No supported Image file format found for \" + img.name);\n}\n", "import { jsonList } from \"../cache.js\";\nimport { fetchData } from \"./fetchdata.js\";\n\n/**\n * parse/preload a JSON files\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the resource is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n */\nexport function preloadJSON(data, onload, onerror, settings) {\n\tif (typeof jsonList[data.name] !== \"undefined\") {\n\t\t// already loaded\n\t\treturn 0;\n\t}\n\n\tfetchData(data.src, \"json\", settings)\n\t\t.then((response) => {\n\t\t\tjsonList[data.name] = response;\n\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t// callback\n\t\t\t\tonload();\n\t\t\t}\n\t\t})\n\t\t.catch((error) => {\n\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\tonerror(error);\n\t\t\t}\n\t\t});\n\n\treturn 1;\n}\n", "/**\n * parse/preload a Javascript files\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the resource is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n */\nexport function preloadJavascript(data, onload, onerror, settings) {\n\tconst script = globalThis.document.createElement(\"script\");\n\n\tscript.src = data.src;\n\tscript.type = \"text/javascript\";\n\tif (typeof crossOrigin === \"string\") {\n\t\tscript.crossOrigin = settings.crossOrigin;\n\t}\n\tscript.defer = true;\n\n\tif (typeof onload === \"function\") {\n\t\tscript.onload = () => {\n\t\t\t// callback\n\t\t\tonload();\n\t\t};\n\t}\n\n\tif (typeof onerror === \"function\") {\n\t\tscript.onerror = () => {\n\t\t\t// callback\n\t\t\tonerror(data.name);\n\t\t};\n\t}\n\n\tglobalThis.document.getElementsByTagName(\"body\")[0].appendChild(script);\n\n\treturn 1;\n}\n", "import { game } from \"../index.js\";\nimport { colorPool } from \"../math/color.ts\";\nimport Body from \"../physics/body.js\";\nimport state from \"../state/state.js\";\nimport { CANVAS_ONRESIZE, eventEmitter } from \"../system/event.ts\";\nimport pool from \"../system/legacy_pool.js\";\nimport { defer } from \"../utils/function\";\nimport { createGUID } from \"../utils/utils\";\nimport Renderable from \"./renderable.js\";\n\n/**\n * Private function to re-use for object removal in a defer\n * @ignore\n */\nfunction deferredRemove(child, keepalive) {\n\tthis.removeChildNow(child, keepalive);\n}\n\nlet globalFloatingCounter = 0;\n\n/**\n * additional import for TypeScript\n * @import {Color} from \"./../math/color.ts\";\n * @import Entity from \"./entity/entity.js\";\n * @import Sprite from \"./sprite.js\";\n * @import Collectable from \"./collectable.js\";\n * @import Trigger from \"./trigger.js\";\n * @import { Draggable } from \"./draggable.js\";\n * @import { DropTarget } from \"./dragndrop.js\";\n * @import NineSliceSprite from \"./nineslicesprite.js\";\n * @import ImageLayer from \"./imagelayer.js\";\n * @import ColorLayer from \"./colorlayer.js\";\n * @import Light2d from \"./light2d.js\";\n * @import UIBaseElement from \"./ui/uibaseelement.js\";\n * @import UISpriteElement from \"./ui/uispriteelement.js\";\n * @import UITextButton from \"./ui/uitextbutton.js\";\n * @import Text from \"./text/text.js\";\n * @import BitmapText from \"./text/bitmaptext.js\";\n * @import {Bounds} from \"./../physics/bounds.ts\";\n * @import CanvasRenderer from \"./../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n */\n\n/**\n * Container represents a collection of child objects\n */\nexport default class Container extends Renderable {\n\t/**\n\t * @param {number} [x=0] - position of the container (accessible via the inherited pos.x property)\n\t * @param {number} [y=0] - position of the container (accessible via the inherited pos.y property)\n\t * @param {number} [width=game.viewport.width] - width of the container\n\t * @param {number} [height=game.viewport.height] - height of the container\n\t */\n\tconstructor(x = 0, y = 0, width, height, root = false) {\n\t\t// call the super constructor\n\t\tsuper(\n\t\t\tx,\n\t\t\ty,\n\t\t\ttypeof width === \"undefined\"\n\t\t\t\t? typeof game.viewport !== \"undefined\"\n\t\t\t\t\t? game.viewport.width\n\t\t\t\t\t: Infinity\n\t\t\t\t: width,\n\t\t\ttypeof height === \"undefined\"\n\t\t\t\t? typeof game.viewport !== \"undefined\"\n\t\t\t\t\t? game.viewport.height\n\t\t\t\t\t: Infinity\n\t\t\t\t: height,\n\t\t);\n\n\t\t/**\n\t\t * keep track of pending sort\n\t\t * @ignore\n\t\t */\n\t\tthis.pendingSort = null;\n\n\t\t/**\n\t\t * whether the container is the root of the scene\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.root = root;\n\n\t\t/**\n\t\t * The array of children of this container.\n\t\t * @ignore\n\t\t */\n\t\tthis.children = undefined;\n\n\t\t/**\n\t\t * The property of the child object that should be used to sort on this container\n\t\t * value : \"x\", \"y\", \"z\"\n\t\t * @type {string}\n\t\t * @default \"z\"\n\t\t */\n\t\tthis.sortOn = \"z\";\n\n\t\t/**\n\t\t * Specify if the children list should be automatically sorted when adding a new child\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoSort = true;\n\n\t\t/**\n\t\t * Specify if the children z index should automatically be managed by the parent container\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoDepth = true;\n\n\t\t/**\n\t\t * Specify if the container draw operation should clip his children to its own bounds\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * a callback to be extended, triggered after a child has been added or removed\n\t\t * @param {number} index - added or removed child index\n\t\t */\n\t\tthis.onChildChange = function () {\n\t\t\t// to be extended\n\t\t};\n\n\t\t/**\n\t\t * Specify if the container bounds should automatically take in account\n\t\t * all child bounds when updated (this is expensive and disabled by default,\n\t\t * only enable if necessary)\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableChildBoundsUpdate = false;\n\n\t\t/**\n\t\t * define a background color for this container\n\t\t * @type {Color}\n\t\t * @default (0, 0, 0, 0.0)\n\t\t * @example\n\t\t * // add a red background color to this container\n\t\t * this.backgroundColor.setColor(255, 0, 0);\n\t\t */\n\t\tthis.backgroundColor = colorPool.get(0, 0, 0, 0.0);\n\n\t\t/**\n\t\t * Used by the debug panel plugin\n\t\t * @ignore\n\t\t */\n\t\tthis.drawCount = 0;\n\n\t\t// container self apply any defined transformation\n\t\tthis.autoTransform = true;\n\n\t\t// enable collision and event detection\n\t\tthis.isKinematic = false;\n\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t// subscribe on the canvas resize event\n\t\tif (this.root === true) {\n\t\t\t// Workaround for not updating container child-bounds automatically (it's expensive!)\n\t\t\teventEmitter.addListener(CANVAS_ONRESIZE, () => {\n\t\t\t\t// temporarly enable the enableChildBoundsUpdate flag\n\t\t\t\t// this.enableChildBoundsUpdate === true;\n\t\t\t\t// update bounds\n\t\t\t\tthis.updateBounds();\n\t\t\t\t// this.enableChildBoundsUpdate === false;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * reset the container, removing all childrens, and reseting transforms.\n\t */\n\treset() {\n\t\t// cancel any sort operation\n\t\tif (this.pendingSort) {\n\t\t\tclearTimeout(this.pendingSort);\n\t\t\tthis.pendingSort = null;\n\t\t}\n\n\t\t// delete all children\n\t\tconst children = this.getChildren();\n\t\tfor (let i = children.length, child; i >= 0; child = children[--i]) {\n\t\t\t// don't remove it if a persistent object\n\t\t\tif (child && child.isPersistent !== true) {\n\t\t\t\tthis.removeChildNow(child);\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.currentTransform !== \"undefined\") {\n\t\t\t// just reset some variables\n\t\t\tthis.currentTransform.identity();\n\t\t}\n\n\t\tthis.backgroundColor.setColor(0, 0, 0, 0.0);\n\t}\n\n\t/**\n\t * Add a child to the container <br>\n\t * if auto-sort is disable, the object will be appended at the bottom of the list.\n\t * Adding a child to the container will automatically remove it from its other container.\n\t * Meaning a child can only have one parent. This is important if you add a renderable\n\t * to a container then add it to the World container it will move it out of the\n\t * orginal container. Then when the World container reset() method is called the renderable\n\t * will not be in any container. <br>\n\t * if the given child implements a onActivateEvent method, that method will be called\n\t * once the child is added to this container.\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText|Tween} child - Child to be added\n\t * @param {number} [z] - forces the z index of the child to the specified value\n\t * @returns {Renderable} the added child\n\t */\n\taddChild(child, z) {\n\t\tif (child.ancestor instanceof Container) {\n\t\t\tchild.ancestor.removeChildNow(child);\n\t\t} else {\n\t\t\t// only allocate a GUID if the object has no previous ancestor\n\t\t\t// (e.g. move one child from one container to another)\n\t\t\tif (child.isRenderable) {\n\t\t\t\t// allocated a GUID value (use child.id as based index if defined)\n\t\t\t\tchild.GUID = createGUID(child.id);\n\t\t\t}\n\t\t}\n\n\t\t// add the new child\n\t\tchild.ancestor = this;\n\t\tthis.getChildren().push(child);\n\n\t\t// update child bounds to reflect the new ancestor\n\t\tif (typeof child.updateBounds === \"function\") {\n\t\t\tif (this.isFloating === true) {\n\t\t\t\t// only parent container can be floating\n\t\t\t\tchild.floating = false;\n\t\t\t}\n\t\t\tchild.updateBounds();\n\t\t}\n\n\t\t// set the child z value if required\n\t\tif (typeof child.pos !== \"undefined\") {\n\t\t\tif (typeof z === \"number\") {\n\t\t\t\tchild.pos.z = z;\n\t\t\t} else if (this.autoDepth === true) {\n\t\t\t\tchild.pos.z = this.getChildren().length;\n\t\t\t}\n\t\t}\n\n\t\tif (this.autoSort === true) {\n\t\t\tthis.sort();\n\t\t}\n\n\t\tif (\n\t\t\ttypeof child.onActivateEvent === \"function\" &&\n\t\t\tthis.isAttachedToRoot()\n\t\t) {\n\t\t\tchild.onActivateEvent();\n\t\t}\n\n\t\t// force container bounds update if required\n\t\tif (this.enableChildBoundsUpdate === true) {\n\t\t\tthis.updateBounds();\n\t\t}\n\n\t\t// if a physic body(ies) to the game world\n\t\tif (this.isAttachedToRoot()) {\n\t\t\tconst worldContainer = this.getRootAncestor();\n\t\t\tif (child.body instanceof Body) {\n\t\t\t\tworldContainer.addBody(child.body);\n\t\t\t}\n\t\t\t// if the child is a container\n\t\t\tif (child instanceof Container) {\n\t\t\t\t// add all container child bodies\n\t\t\t\t// TODO: make it recursive ?\n\t\t\t\tchild.forEach((cchild) => {\n\t\t\t\t\tif (cchild.body instanceof Body) {\n\t\t\t\t\t\tworldContainer.addBody(cchild.body);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// mark the container for repaint\n\t\tthis.isDirty = true;\n\n\t\t// triggered callback if defined\n\t\tthis.onChildChange.call(this, this.getChildren().length - 1);\n\n\t\treturn child;\n\t}\n\n\t/**\n\t * Add a child to the container at the specified index<br>\n\t * (the list won't be sorted after insertion)\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be added\n\t * @param {number} index - The index at which to insert the child\n\t * @returns {Renderable} the added child\n\t */\n\taddChildAt(child, index) {\n\t\tif (index >= 0 && index <= this.getChildren().length) {\n\t\t\tif (child.ancestor instanceof Container) {\n\t\t\t\tchild.ancestor.removeChildNow(child);\n\t\t\t} else {\n\t\t\t\t// only allocate a GUID if the object has no previous ancestor\n\t\t\t\t// (e.g. move one child from one container to another)\n\t\t\t\tif (child.isRenderable) {\n\t\t\t\t\t// allocated a GUID value\n\t\t\t\t\tchild.GUID = createGUID();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add the new child\n\t\t\tchild.ancestor = this;\n\t\t\tthis.getChildren().splice(index, 0, child);\n\n\t\t\t// update child bounds to reflect the new ancestor\n\t\t\tif (typeof child.updateBounds === \"function\") {\n\t\t\t\tif (this.isFloating === true) {\n\t\t\t\t\t// only parent container can be floating\n\t\t\t\t\tchild.floating = false;\n\t\t\t\t}\n\t\t\t\tchild.updateBounds();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeof child.onActivateEvent === \"function\" &&\n\t\t\t\tthis.isAttachedToRoot()\n\t\t\t) {\n\t\t\t\tchild.onActivateEvent();\n\t\t\t}\n\n\t\t\t// force container bounds update if required\n\t\t\tif (this.enableChildBoundsUpdate === true) {\n\t\t\t\tthis.updateBounds();\n\t\t\t}\n\n\t\t\t// if a physic body(ies) to the game world\n\t\t\tif (this.isAttachedToRoot()) {\n\t\t\t\tconst worldContainer = this.getRootAncestor();\n\t\t\t\tif (child.body instanceof Body) {\n\t\t\t\t\tworldContainer.addBody(child.body);\n\t\t\t\t}\n\t\t\t\t// if the child is a container\n\t\t\t\tif (child instanceof Container) {\n\t\t\t\t\t// add all container child bodies\n\t\t\t\t\t// TODO: make it recursive ?\n\t\t\t\t\tchild.forEach((cchild) => {\n\t\t\t\t\t\tif (cchild.body instanceof Body) {\n\t\t\t\t\t\t\tworldContainer.addBody(cchild.body);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// mark the container for repaint\n\t\t\tthis.isDirty = true;\n\n\t\t\t// triggered callback if defined\n\t\t\tthis.onChildChange.call(this, index);\n\n\t\t\treturn child;\n\t\t} else {\n\t\t\tthrow new Error(\"Index (\" + index + \") Out Of Bounds for addChildAt()\");\n\t\t}\n\t}\n\n\t/**\n\t * The forEach() method executes a provided function once per child element. <br>\n\t * the callback function is invoked with three arguments: <br>\n\t * - The current element being processed in the array <br>\n\t * - The index of element in the array. <br>\n\t * - The array forEach() was called upon. <br>\n\t * @param {Function} callback - fnction to execute on each element\n\t * @param {object} [thisArg] - value to use as this(i.e reference Object) when executing callback.\n\t * @example\n\t * // iterate through all children of this container\n\t * container.forEach((child) => {\n\t * // do something with the child\n\t * child.doSomething();\n\t * });\n\t * container.forEach((child, index) => { ... });\n\t * container.forEach((child, index, array) => { ... });\n\t * container.forEach((child, index, array) => { ... }, thisArg);\n\t */\n\tforEach(callback, thisArg) {\n\t\tlet i = 0;\n\t\tconst children = this.getChildren();\n\n\t\tconst len = children.length;\n\n\t\tif (typeof callback !== \"function\") {\n\t\t\tthrow new Error(callback + \" is not a function\");\n\t\t}\n\n\t\twhile (i < len) {\n\t\t\tcallback.call(thisArg ?? this, children[i], i, children);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n\t * Swaps the position (z-index) of 2 children\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be added\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child2 - Child to be added\n\t */\n\tswapChildren(child, child2) {\n\t\tconst index = this.getChildIndex(child);\n\t\tconst index2 = this.getChildIndex(child2);\n\n\t\tif (index !== -1 && index2 !== -1) {\n\t\t\t// swap z index\n\t\t\tconst _z = child.pos.z;\n\t\t\tchild.pos.z = child2.pos.z;\n\t\t\tchild2.pos.z = _z;\n\t\t\t// swap the positions..\n\t\t\tthis.getChildren()[index] = child2;\n\t\t\tthis.getChildren()[index2] = child;\n\t\t\t// mark the container as dirty\n\t\t\tthis.isDirty = true;\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\tchild +\n\t\t\t\t\t\" Both the supplied childs must be a child of the caller \" +\n\t\t\t\t\tthis,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the Child at the specified index\n\t * @param {number} index - The index of the child\n\t * @returns {Renderable} the child at the specified index\n\t */\n\tgetChildAt(index) {\n\t\tif (index >= 0 && index < this.getChildren().length) {\n\t\t\treturn this.getChildren()[index];\n\t\t} else {\n\t\t\tthrow new Error(\"Index (\" + index + \") Out Of Bounds for getChildAt()\");\n\t\t}\n\t}\n\n\t/**\n\t * Returns the index of the given Child\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - The child object\n\t * @returns {number} index\n\t */\n\tgetChildIndex(child) {\n\t\treturn this.getChildren().indexOf(child);\n\t}\n\n\t/**\n\t * Returns the next child within the container or undefined if none\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - The child object\n\t * @returns {Renderable} child\n\t */\n\tgetNextChild(child) {\n\t\tconst index = this.getChildren().indexOf(child) + 1;\n\t\tif (index >= 0 && index < this.getChildren().length) {\n\t\t\treturn this.getChildAt(index);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Returns true if contains the specified Child\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - The child object\n\t * @returns {boolean}\n\t */\n\thasChild(child) {\n\t\treturn this === child.ancestor;\n\t}\n\n\t/**\n\t * return the child corresponding to the given property and value.<br>\n\t * note : avoid calling this function every frame since\n\t * it parses the whole object tree each time\n\t * @param {string} prop - Property name\n\t * @param {string|RegExp|number|boolean} value - Value of the property\n\t * @returns {Renderable[]} Array of childs\n\t * @example\n\t * // get the first child object called \"mainPlayer\" in a specific container :\n\t * let ent = myContainer.getChildByProp(\"name\", \"mainPlayer\");\n\t *\n\t * // or query the whole world :\n\t * let ent = container.getChildByProp(\"name\", \"mainPlayer\");\n\t *\n\t * // partial property matches are also allowed by using a RegExp.\n\t * // the following matches \"redCOIN\", \"bluecoin\", \"bagOfCoins\", etc :\n\t * let allCoins = container.getChildByProp(\"name\", /coin/i);\n\t *\n\t * // searching for numbers or other data types :\n\t * let zIndex10 = container.getChildByProp(\"z\", 10);\n\t * let inViewport = container.getChildByProp(\"inViewport\", true);\n\t */\n\tgetChildByProp(prop, value) {\n\t\tlet objList = [];\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tfunction compare(obj, prop) {\n\t\t\tconst v = obj[prop];\n\t\t\tif (value instanceof RegExp && typeof v === \"string\") {\n\t\t\t\tif (value.test(v)) {\n\t\t\t\t\tobjList.push(obj);\n\t\t\t\t}\n\t\t\t} else if (v === value) {\n\t\t\t\tobjList.push(obj);\n\t\t\t}\n\t\t}\n\n\t\tthis.forEach((child) => {\n\t\t\tcompare(child, prop);\n\t\t\tif (child instanceof Container) {\n\t\t\t\tobjList = objList.concat(child.getChildByProp(prop, value));\n\t\t\t}\n\t\t});\n\n\t\treturn objList;\n\t}\n\n\t/**\n\t * returns the list of childs with the specified class type\n\t * @param {object} classType - Class type\n\t * @returns {Renderable[]} Array of children\n\t */\n\tgetChildByType(classType) {\n\t\tlet objList = [];\n\n\t\tthis.forEach((child) => {\n\t\t\tif (child instanceof classType) {\n\t\t\t\tobjList.push(child);\n\t\t\t}\n\t\t\tif (child instanceof Container) {\n\t\t\t\tobjList = objList.concat(child.getChildByType(classType));\n\t\t\t}\n\t\t});\n\n\t\treturn objList;\n\t}\n\n\t/**\n\t * returns the list of childs with the specified name<br>\n\t * as defined in Tiled (Name field of the Object Properties)<br>\n\t * note : avoid calling this function every frame since\n\t * it parses the whole object list each time\n\t * @param {string|RegExp|number|boolean} name - child name\n\t * @returns {Renderable[]} Array of children\n\t */\n\tgetChildByName(name) {\n\t\treturn this.getChildByProp(\"name\", name);\n\t}\n\n\t/**\n\t * return the child corresponding to the specified GUID<br>\n\t * note : avoid calling this function every frame since\n\t * it parses the whole object list each time\n\t * @param {string|RegExp|number|boolean} guid - child GUID\n\t * @returns {Renderable} corresponding child or null\n\t */\n\tgetChildByGUID(guid) {\n\t\tconst obj = this.getChildByProp(\"GUID\", guid);\n\t\treturn obj.length > 0 ? obj[0] : null;\n\t}\n\n\t/**\n\t * return all child in this container\n\t * @returns {Renderable[]} an array of renderable object\n\t */\n\tgetChildren() {\n\t\tif (typeof this.children === \"undefined\") {\n\t\t\tthis.children = [];\n\t\t}\n\t\treturn this.children;\n\t}\n\n\t/**\n\t * update the bounding box for this container.\n\t * @param {boolean} [absolute=true] - update the bounds size and position in (world) absolute coordinates\n\t * @returns {Bounds} this container bounding box Rectangle object\n\t */\n\tupdateBounds(absolute = true) {\n\t\tconst bounds = this.getBounds();\n\n\t\t// call parent method\n\t\tsuper.updateBounds(absolute);\n\n\t\tif (this.enableChildBoundsUpdate === true) {\n\t\t\tthis.forEach((child) => {\n\t\t\t\tif (child.isRenderable) {\n\t\t\t\t\tconst childBounds = child.updateBounds(absolute);\n\t\t\t\t\tif (childBounds.isFinite()) {\n\t\t\t\t\t\tbounds.addBounds(childBounds);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * Checks if this container is root or if it's attached to the root container.\n\t * @returns {boolean} true if this container is root or if it's attached to the root container\n\t */\n\tisAttachedToRoot() {\n\t\tif (this.root === true) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tlet ancestor = this.ancestor;\n\t\t\twhile (ancestor) {\n\t\t\t\tif (ancestor.root === true) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tancestor = ancestor.ancestor;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the instance of the root container (i.e. the current application World container).\n\t * @returns {Container} root container\n\t */\n\tgetRootAncestor() {\n\t\tif (this.root === true) {\n\t\t\treturn this;\n\t\t} else {\n\t\t\tlet ancestor = this.ancestor;\n\t\t\twhile (ancestor) {\n\t\t\t\tif (ancestor.root === true) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tancestor = ancestor.ancestor;\n\t\t\t}\n\t\t\treturn ancestor;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonActivateEvent() {\n\t\tthis.forEach((child) => {\n\t\t\tif (typeof child.onActivateEvent === \"function\") {\n\t\t\t\tchild.onActivateEvent();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Invokes the removeChildNow in a defer, to ensure the child is removed safely after the update & draw stack has completed. <br>\n\t * if the given child implements a onDeactivateEvent() method, that method will be called once the child is removed from this container.\n\t * @param {Renderable|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be removed\n\t * @param {boolean} [keepalive=false] - true to prevent calling child.destroy()\n\t */\n\tremoveChild(child, keepalive) {\n\t\tif (this.hasChild(child)) {\n\t\t\tdefer(deferredRemove, this, child, keepalive);\n\t\t} else {\n\t\t\tthrow new Error(\"Child is not mine.\");\n\t\t}\n\t}\n\n\t/**\n\t * Removes (and optionally destroys) a child from the container.<br>\n\t * (removal is immediate and unconditional)<br>\n\t * Never use keepalive=true with objects from {@link pool}. Doing so will create a memory leak.\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText|Tween} child - Child to be removed\n\t * @param {boolean} [keepalive=False] - True to prevent calling child.destroy()\n\t */\n\tremoveChildNow(child, keepalive) {\n\t\tif (this.hasChild(child) && this.getChildIndex(child) >= 0) {\n\t\t\tif (typeof child.onDeactivateEvent === \"function\") {\n\t\t\t\tchild.onDeactivateEvent();\n\t\t\t}\n\n\t\t\t// remove the body first to avoid a condition where a body can be detached\n\t\t\t// from its parent, before the body is removed from the game world\n\t\t\tif (child.body instanceof Body) {\n\t\t\t\tconst root = this.getRootAncestor();\n\t\t\t\tif (root) {\n\t\t\t\t\troot.removeBody(child.body);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!keepalive) {\n\t\t\t\t// attempt at recycling the object\n\t\t\t\tif (pool.push(child, false) === false) {\n\t\t\t\t\t// else just destroy it\n\t\t\t\t\tif (typeof child.destroy === \"function\") {\n\t\t\t\t\t\tchild.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't cache the child index; another element might have been removed\n\t\t\t// by the child's `onDeactivateEvent` or `destroy` methods\n\t\t\tconst childIndex = this.getChildIndex(child);\n\t\t\tif (childIndex >= 0) {\n\t\t\t\tthis.getChildren().splice(childIndex, 1);\n\t\t\t\tchild.ancestor = undefined;\n\t\t\t}\n\n\t\t\t// force bounds update if required\n\t\t\tif (this.enableChildBoundsUpdate === true) {\n\t\t\t\tthis.updateBounds();\n\t\t\t}\n\n\t\t\t// mark the container for repaint\n\t\t\tthis.isDirty = true;\n\n\t\t\t// triggered callback if defined\n\t\t\tthis.onChildChange.call(this, childIndex);\n\t\t}\n\t}\n\n\t/**\n\t * Automatically set the specified property of all childs to the given value\n\t * @param {string} prop - property name\n\t * @param {object} value - property value\n\t * @param {boolean} [recursive=false] - recursively apply the value to child containers if true\n\t */\n\tsetChildsProperty(prop, value, recursive) {\n\t\tthis.forEach((child) => {\n\t\t\tif (recursive === true && child instanceof Container) {\n\t\t\t\tchild.setChildsProperty(prop, value, recursive);\n\t\t\t}\n\t\t\tchild[prop] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Move the child in the group one step forward (z depth).\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be moved\n\t */\n\tmoveUp(child) {\n\t\tconst childIndex = this.getChildIndex(child);\n\t\tif (childIndex - 1 >= 0) {\n\t\t\t// note : we use an inverted loop\n\t\t\tthis.swapChildren(child, this.getChildAt(childIndex - 1));\n\t\t\t// mark the container as dirty\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * Move the child in the group one step backward (z depth).\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be moved\n\t */\n\tmoveDown(child) {\n\t\tconst childIndex = this.getChildIndex(child);\n\t\tif (childIndex >= 0 && childIndex + 1 < this.getChildren().length) {\n\t\t\t// note : we use an inverted loop\n\t\t\tthis.swapChildren(child, this.getChildAt(childIndex + 1));\n\t\t\t// mark the container as dirty\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * Move the specified child to the top(z depth).\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be moved\n\t */\n\tmoveToTop(child) {\n\t\tconst childIndex = this.getChildIndex(child);\n\t\tif (childIndex > 0) {\n\t\t\tconst children = this.getChildren();\n\t\t\t// note : we use an inverted loop\n\t\t\tchildren.splice(0, 0, children.splice(childIndex, 1)[0]);\n\t\t\t// increment our child z value based on the previous child depth\n\t\t\tchild.pos.z = children[1].pos.z + 1;\n\t\t\t// mark the container as dirty\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * Move the specified child the bottom (z depth).\n\t * @param {Renderable|Entity|Sprite|Collectable|Trigger|Draggable|DropTarget|NineSliceSprite|ImageLayer|ColorLayer|Light2d|UIBaseElement|UISpriteElement|UITextButton|Text|BitmapText} child - Child to be moved\n\t */\n\tmoveToBottom(child) {\n\t\tconst childIndex = this.getChildIndex(child);\n\t\tconst children = this.getChildren();\n\t\tif (childIndex >= 0 && childIndex < children.length - 1) {\n\t\t\t// note : we use an inverted loop\n\t\t\tchildren.splice(\n\t\t\t\tchildren.length - 1,\n\t\t\t\t0,\n\t\t\t\tchildren.splice(childIndex, 1)[0],\n\t\t\t);\n\t\t\t// increment our child z value based on the next child depth\n\t\t\tchild.pos.z = children[children.length - 2].pos.z - 1;\n\t\t\t// mark the container as dirty\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * Manually trigger the sort of all the childs in the container\n\t * @param {boolean} [recursive=false] - recursively sort all containers if true\n\t */\n\tsort(recursive) {\n\t\t// do nothing if there is already a pending sort\n\t\tif (!this.pendingSort) {\n\t\t\tif (recursive === true) {\n\t\t\t\tthis.forEach((child) => {\n\t\t\t\t\tif (child instanceof Container) {\n\t\t\t\t\t\t// note : this will generate one defered sorting function\n\t\t\t\t\t\t// for each existing containe\n\t\t\t\t\t\tchild.sort(recursive);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.pendingSort = defer(function () {\n\t\t\t\t// sort everything in this container\n\t\t\t\tthis.getChildren().sort(this[\"_sort\" + this.sortOn.toUpperCase()]);\n\t\t\t\t// clear the defer id\n\t\t\t\tthis.pendingSort = null;\n\t\t\t\t// make sure we redraw everything\n\t\t\t\tthis.isDirty = true;\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonDeactivateEvent() {\n\t\tthis.forEach((child) => {\n\t\t\tif (typeof child.onDeactivateEvent === \"function\") {\n\t\t\t\tchild.onDeactivateEvent();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Z Sorting function\n\t * @ignore\n\t */\n\t_sortZ(a, b) {\n\t\treturn b.pos && a.pos ? b.pos.z - a.pos.z : a.pos ? -Infinity : Infinity;\n\t}\n\n\t/**\n\t * Reverse Z Sorting function\n\t * @ignore\n\t */\n\t_sortReverseZ(a, b) {\n\t\treturn a.pos && b.pos ? a.pos.z - b.pos.z : a.pos ? Infinity : -Infinity;\n\t}\n\n\t/**\n\t * X Sorting function\n\t * @ignore\n\t */\n\t_sortX(a, b) {\n\t\tif (!b.pos || !a.pos) {\n\t\t\treturn a.pos ? -Infinity : Infinity;\n\t\t}\n\t\tconst result = b.pos.z - a.pos.z;\n\t\treturn result ? result : b.pos.x - a.pos.x;\n\t}\n\n\t/**\n\t * Y Sorting function\n\t * @ignore\n\t */\n\t_sortY(a, b) {\n\t\tif (!b.pos || !a.pos) {\n\t\t\treturn a.pos ? -Infinity : Infinity;\n\t\t}\n\t\tconst result = b.pos.z - a.pos.z;\n\t\treturn result ? result : b.pos.y - a.pos.y;\n\t}\n\n\t/**\n\t * Destroy function<br>\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// empty the container\n\t\tthis.reset();\n\t\t// call the parent destroy method\n\t\tsuper.destroy(arguments);\n\n\t\tcolorPool.release(this.backgroundColor);\n\t}\n\n\t/**\n\t * container update function. <br>\n\t * automatically called by the application update loop {@link Application}\n\t * @protected\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean} true if the Container is dirty\n\t */\n\tupdate(dt) {\n\t\tlet isFloating = false;\n\t\tconst isPaused = state.isPaused();\n\t\tconst children = this.getChildren();\n\t\tconst childrenLength = children.length;\n\t\tconst cameras = state.current().cameras;\n\n\t\tfor (let i = childrenLength, obj; i--, (obj = children[i]); ) {\n\t\t\tif (isPaused && !obj.updateWhenPaused) {\n\t\t\t\t// skip this object\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (obj.isRenderable) {\n\t\t\t\tisFloating = globalFloatingCounter > 0 || obj.floating;\n\t\t\t\tif (isFloating) {\n\t\t\t\t\tglobalFloatingCounter++;\n\t\t\t\t}\n\n\t\t\t\t// check if object is in any active cameras\n\t\t\t\tobj.inViewport = false;\n\t\t\t\t// iterate through all cameras\n\t\t\t\tcameras.forEach((camera) => {\n\t\t\t\t\tif (camera.isVisible(obj, isFloating)) {\n\t\t\t\t\t\tobj.inViewport = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// update our object\n\t\t\t\tthis.isDirty |= (obj.inViewport || obj.alwaysUpdate) && obj.update(dt);\n\n\t\t\t\tif (globalFloatingCounter > 0) {\n\t\t\t\t\tglobalFloatingCounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// just directly call update() for non renderable object\n\t\t\t\tthis.isDirty |= obj.update(dt);\n\t\t\t}\n\t\t}\n\n\t\t// call the parent method\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * draw this renderable (automatically called by melonJS)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer, viewport) {\n\t\tlet isFloating = false;\n\t\tconst bounds = this.getBounds();\n\n\t\tthis.drawCount = 0;\n\n\t\t// clip the containter children to the container bounds\n\t\tif (\n\t\t\tthis.root === false &&\n\t\t\tthis.clipping === true &&\n\t\t\tbounds.isFinite() === true\n\t\t) {\n\t\t\trenderer.clipRect(bounds.left, bounds.top, bounds.width, bounds.height);\n\t\t}\n\n\t\t// adjust position if required (e.g. canvas/window centering)\n\t\trenderer.translate(this.pos.x, this.pos.y);\n\n\t\t// color background if defined\n\t\tif (this.backgroundColor.alpha > 1 / 255) {\n\t\t\trenderer.clearColor(this.backgroundColor);\n\t\t}\n\n\t\tconst children = this.getChildren();\n\t\tfor (let i = children.length, obj; i--, (obj = children[i]); ) {\n\t\t\tif (obj.isRenderable) {\n\t\t\t\tisFloating = obj.floating === true;\n\n\t\t\t\tif (obj.inViewport || isFloating) {\n\t\t\t\t\tif (isFloating) {\n\t\t\t\t\t\t// translate to screen coordinates\n\t\t\t\t\t\trenderer.save();\n\t\t\t\t\t\trenderer.resetTransform();\n\t\t\t\t\t}\n\n\t\t\t\t\t// predraw (apply transforms)\n\t\t\t\t\tobj.preDraw(renderer);\n\n\t\t\t\t\t// draw the object\n\t\t\t\t\tobj.draw(renderer, viewport);\n\n\t\t\t\t\t// postdraw (clean-up);\n\t\t\t\t\tobj.postDraw(renderer);\n\n\t\t\t\t\t// restore the previous \"state\"\n\t\t\t\t\tif (isFloating) {\n\t\t\t\t\t\trenderer.restore();\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.drawCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", "// bitmask constants to check for flipped & rotated tiles\nexport const TMX_FLIP_H = 0x80000000;\nexport const TMX_FLIP_V = 0x40000000;\nexport const TMX_FLIP_AD = 0x20000000;\nexport const TMX_CLEAR_BIT_MASK = ~(TMX_FLIP_H | TMX_FLIP_V | TMX_FLIP_AD);\n\n// constant to identify the collision object layer\nexport const COLLISION_GROUP = \"collision\";\n", "import { degToRad, pow } from \"../math/math.ts\";\n\n/**\n * @ignore\n */\nfunction correctRadii(\n\tsignedRx: number,\n\tsignedRy: number,\n\tx1p: number,\n\ty1p: number,\n) {\n\tconst prx = Math.abs(signedRx);\n\tconst pry = Math.abs(signedRy);\n\n\tconst A = pow(x1p) / pow(prx) + pow(y1p) / pow(pry);\n\n\tconst rx = A > 1 ? Math.sqrt(A) * prx : prx;\n\tconst ry = A > 1 ? Math.sqrt(A) * pry : pry;\n\n\treturn [rx, ry];\n}\n\n/**\n * @ignore\n */\nfunction mat2DotVec2(\n\t[m00, m01, m10, m11]: [number, number, number, number],\n\t[vx, vy]: [number, number],\n) {\n\treturn [m00 * vx + m01 * vy, m10 * vx + m11 * vy] as [number, number];\n}\n\n/**\n * @ignore\n */\nfunction vec2Add([ux, uy]: [number, number], [vx, vy]: [number, number]) {\n\treturn [ux + vx, uy + vy];\n}\n\n/**\n * @ignore\n */\nfunction vec2Scale([a0, a1]: [number, number], scalar: number) {\n\treturn [a0 * scalar, a1 * scalar];\n}\n\n/**\n * @ignore\n */\nfunction vec2Dot([ux, uy]: [number, number], [vx, vy]: [number, number]) {\n\treturn ux * vx + uy * vy;\n}\n\n/**\n * @ignore\n */\nfunction vec2Mag([ux, uy]: [number, number]) {\n\treturn Math.sqrt(ux ** 2 + uy ** 2);\n}\n\n/**\n * @ignore\n */\nfunction vec2Angle(u: [number, number], v: [number, number]) {\n\tconst [ux, uy] = u;\n\tconst [vx, vy] = v;\n\tconst sign = ux * vy - uy * vx >= 0 ? 1 : -1;\n\treturn sign * Math.acos(vec2Dot(u, v) / (vec2Mag(u) * vec2Mag(v)));\n}\n\n// From https://svgwg.org/svg2-draft/implnote.html#ArcConversionEndpointToCenter\n/**\n * Converts endpoint parameterization of an SVG arc to center parameterization.\n *\n * This function calculates the center (cx, cy), radii (rx, ry), start angle,\n * end angle, x-axis rotation, and sweep flag (anticlockwise) of an SVG arc path\n * given its endpoint parameterization.\n * @param x1 - The x-coordinate of the start point of the arc.\n * @param y1 - The y-coordinate of the start point of the arc.\n * @param x2 - The x-coordinate of the end point of the arc.\n * @param y2 - The y-coordinate of the end point of the arc.\n * @param largeArcFlag - The large arc flag. If true, the arc sweep will be greater than 180 degrees.\n * @param sweepFlag - The sweep flag. If true, the arc will be drawn in a \"positive-angle\" direction.\n * @param srx - The x-axis radius of the arc.\n * @param sry - The y-axis radius of the arc.\n * @param xAxisRotationDeg - The rotation angle in degrees of the x-axis of the ellipse relative to the x-axis of the coordinate system.\n * @returns An object containing the center coordinates, radii, start and end angles, x-axis rotation, and sweep direction of an SVG arc given its endpoint parameters.\n */\nexport function endpointToCenterParameterization(\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n\tlargeArcFlag: boolean,\n\tsweepFlag: boolean,\n\tsrx: number,\n\tsry: number,\n\txAxisRotationDeg: number,\n) {\n\tconst xAxisRotation = degToRad(xAxisRotationDeg);\n\n\tconst cosphi = Math.cos(xAxisRotation);\n\tconst sinphi = Math.sin(xAxisRotation);\n\n\tconst [x1p, y1p] = mat2DotVec2(\n\t\t[cosphi, sinphi, -sinphi, cosphi],\n\t\t[(x1 - x2) / 2, (y1 - y2) / 2],\n\t);\n\n\tconst [rx, ry] = correctRadii(srx, sry, x1p, y1p);\n\n\tconst sign = largeArcFlag !== sweepFlag ? 1 : -1;\n\tconst n = pow(rx) * pow(ry) - pow(rx) * pow(y1p) - pow(ry) * pow(x1p);\n\tconst d = pow(rx) * pow(y1p) + pow(ry) * pow(x1p);\n\n\tconst [cxp, cyp] = vec2Scale(\n\t\t[(rx * y1p) / ry, (-ry * x1p) / rx],\n\t\tsign * Math.sqrt(Math.abs(n / d)),\n\t);\n\n\tconst [cx, cy] = vec2Add(\n\t\tmat2DotVec2([cosphi, -sinphi, sinphi, cosphi], [cxp, cyp]),\n\t\t[(x1 + x2) / 2, (y1 + y2) / 2],\n\t);\n\n\tconst a = [(x1p - cxp) / rx, (y1p - cyp) / ry] satisfies [number, number];\n\tconst b = [(-x1p - cxp) / rx, (-y1p - cyp) / ry] satisfies [number, number];\n\tconst startAngle = vec2Angle([1, 0], a);\n\tconst deltaAngle0 = vec2Angle(a, b) % (2 * Math.PI);\n\n\tconst deltaAngle =\n\t\t!sweepFlag && deltaAngle0 > 0\n\t\t\t? deltaAngle0 - 2 * Math.PI\n\t\t\t: sweepFlag && deltaAngle0 < 0\n\t\t\t\t? deltaAngle0 + 2 * Math.PI\n\t\t\t\t: deltaAngle0;\n\n\tconst endAngle = startAngle + deltaAngle;\n\n\treturn {\n\t\tcx,\n\t\tcy,\n\t\trx,\n\t\try,\n\t\tstartAngle,\n\t\tendAngle,\n\t\txAxisRotation,\n\t\tanticlockwise: deltaAngle < 0,\n\t};\n}\n", "import { TAU } from \"./../math/math.ts\";\nimport { earcut } from \"./earcut.ts\";\nimport { pointPool } from \"./point.ts\";\nimport { endpointToCenterParameterization } from \"./toarccanvas.ts\";\n\n/**\n * additional import for TypeScript\n * @import {Point} from \"./point.ts\";\n */\n\n/**\n * a simplified path2d implementation, supporting only one path\n */\nclass Path2D {\n\tconstructor(svgPath) {\n\t\t/**\n\t\t * the points defining the current path\n\t\t * @type {Point[]}\n\t\t */\n\t\tthis.points = [];\n\n\t\t/**\n\t\t * space between interpolated points for quadratic and bezier curve approx. in pixels.\n\t\t * @type {number}\n\t\t * @default 5\n\t\t */\n\t\tthis.arcResolution = 5;\n\n\t\t/* @ignore */\n\t\tthis.vertices = [];\n\n\t\t/* @ignore */\n\t\tthis.startPoint = pointPool.get();\n\n\t\t/* @ignore */\n\t\tthis.isDirty = false;\n\n\t\tif (typeof svgPath === \"string\") {\n\t\t\tthis.parseSVGPath(svgPath);\n\t\t}\n\t}\n\n\t/**\n\t * Parses an SVG path string and adds the points to the current path.\n\t * @param {string} svgPath - The SVG path string to parse.\n\t */\n\tparseSVGPath(svgPath) {\n\t\t// Split path into commands and coordinates\n\t\tconst pathCommands = svgPath.match(/([a-df-z])[^a-df-z]*/gi);\n\t\tconst points = this.points;\n\t\tconst startPoint = this.startPoint;\n\t\tlet lastPoint = startPoint;\n\n\t\tthis.beginPath();\n\n\t\t// Process each command and corresponding coordinates\n\t\tfor (let i = 0; i < pathCommands.length; i++) {\n\t\t\tconst pathCommand = pathCommands[i];\n\t\t\tconst command = pathCommand[0].toUpperCase();\n\t\t\tconst coordinates = pathCommand\n\t\t\t\t.slice(1)\n\t\t\t\t.trim()\n\t\t\t\t.split(/[\\s,]+/)\n\t\t\t\t.map(parseFloat);\n\n\t\t\tswitch (command) {\n\t\t\t\tcase \"A\":\n\t\t\t\t\t{\n\t\t\t\t\t\t// A command takes 5 coordinates\n\t\t\t\t\t\tconst p = endpointToCenterParameterization(...coordinates);\n\t\t\t\t\t\tthis.arc(\n\t\t\t\t\t\t\tp.x,\n\t\t\t\t\t\t\tp.y,\n\t\t\t\t\t\t\tp.radiusX,\n\t\t\t\t\t\t\tp.radiusY,\n\t\t\t\t\t\t\tp.rotation,\n\t\t\t\t\t\t\tp.startAngle,\n\t\t\t\t\t\t\tp.endAngle,\n\t\t\t\t\t\t\tp.applyanticlockwise,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"H\":\n\t\t\t\t\t// H take 1 coordinate\n\t\t\t\t\tlastPoint =\n\t\t\t\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\t\t\t\t\tthis.lineTo(lastPoint.x + coordinates[0], lastPoint.y);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"V\":\n\t\t\t\t\t// V take 1 coordinate\n\t\t\t\t\tlastPoint =\n\t\t\t\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\t\t\t\t\tthis.lineTo(lastPoint.x, lastPoint.y + coordinates[0]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"M\":\n\t\t\t\t\t// M takes 2 coordinates\n\t\t\t\t\tthis.moveTo(...coordinates);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"L\":\n\t\t\t\t\t// L takes 2 coordinates\n\t\t\t\t\tthis.lineTo(...coordinates);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Q\":\n\t\t\t\t\t// Q takes 4 coordinates\n\t\t\t\t\tthis.quadraticCurveTo(...coordinates);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"C\":\n\t\t\t\t\t// C takes 6 coordinates\n\t\t\t\t\tthis.bezierCurveTo(...coordinates);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\t\tthis.closePath();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn(\"Unsupported command:\", command);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * begin a new path\n\t */\n\tbeginPath() {\n\t\t// empty the cache and recycle all vectors\n\t\tthis.points.forEach((point) => {\n\t\t\tpointPool.release(point);\n\t\t});\n\t\tthis.isDirty = true;\n\t\tthis.points.length = 0;\n\t\tthis.startPoint.set(0, 0);\n\t}\n\n\t/**\n\t * causes the point of the pen to move back to the start of the current path.\n\t * It tries to draw a straight line from the current point to the start.\n\t * If the shape has already been closed or has only one point, this function does nothing.\n\t */\n\tclosePath() {\n\t\tconst points = this.points;\n\t\tif (points.length > 0) {\n\t\t\tconst firstPoint = points[0];\n\t\t\tif (!firstPoint.equals(points[points.length - 1])) {\n\t\t\t\tthis.lineTo(firstPoint.x, firstPoint.y);\n\t\t\t}\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/**\n\t * triangulate the shape defined by this path into an array of triangles\n\t * @returns {Point[]} an array of vertices representing the triangulated path or shape\n\t */\n\ttriangulatePath() {\n\t\tconst vertices = this.vertices;\n\n\t\tif (this.isDirty) {\n\t\t\tconst points = this.points;\n\t\t\tconst indices = earcut(\n\t\t\t\tpoints.flatMap((p) => {\n\t\t\t\t\treturn [p.x, p.y];\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst indicesLength = indices.length;\n\n\t\t\t// pre-allocate vertices if necessary\n\t\t\twhile (vertices.length < indicesLength) {\n\t\t\t\tvertices.push(pointPool.get());\n\t\t\t}\n\n\t\t\t// calculate all vertices\n\t\t\tfor (let i = 0; i < indicesLength; i++) {\n\t\t\t\tconst point = points[indices[i]];\n\t\t\t\tvertices[i].set(point.x, point.y);\n\t\t\t}\n\n\t\t\t// recycle overhead from a previous triangulation\n\t\t\twhile (vertices.length > indicesLength) {\n\t\t\t\tpointPool.release(vertices[vertices.length - 1]);\n\t\t\t\tvertices.length -= 1;\n\t\t\t}\n\t\t\tthis.isDirty = false;\n\t\t}\n\n\t\treturn vertices;\n\t}\n\n\t/**\n\t * moves the starting point of the current path to the (x, y) coordinates.\n\t * @param {number} x - the x-axis (horizontal) coordinate of the point.\n\t * @param {number} y - the y-axis (vertical) coordinate of the point.\n\t */\n\tmoveTo(x, y) {\n\t\tthis.startPoint.set(x, y);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * connects the last point in the current path to the (x, y) coordinates with a straight line.\n\t * @param {number} x - the x-axis coordinate of the line's end point.\n\t * @param {number} y - the y-axis coordinate of the line's end point.\n\t */\n\tlineTo(x, y) {\n\t\tconst points = this.points;\n\t\tconst startPoint = this.startPoint;\n\t\tconst lastPoint =\n\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\n\t\tif (!startPoint.equals(lastPoint)) {\n\t\t\tpoints.push(pointPool.get(startPoint.x, startPoint.y));\n\t\t} else {\n\t\t\tpoints.push(pointPool.get(lastPoint.x, lastPoint.y));\n\t\t}\n\t\tpoints.push(pointPool.get(x, y));\n\n\t\tstartPoint.x = x;\n\t\tstartPoint.y = y;\n\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * adds an arc to the current path which is centered at (x, y) position with the given radius,\n\t * starting at startAngle and ending at endAngle going in the given direction by counterclockwise (defaulting to clockwise).\n\t * @param {number} x - the horizontal coordinate of the arc's center.\n\t * @param {number} y - the vertical coordinate of the arc's center.\n\t * @param {number} radius - the arc's radius. Must be positive.\n\t * @param {number} startAngle - the angle at which the arc starts in radians, measured from the positive x-axis.\n\t * @param {number} endAngle - the angle at which the arc ends in radians, measured from the positive x-axis.\n\t * @param {boolean} [anticlockwise=false] - an optional boolean value. If true, draws the arc counter-clockwise between the start and end angles.\n\t */\n\tarc(x, y, radius, startAngle, endAngle, anticlockwise = false) {\n\t\t// based on from https://github.com/karellodewijk/canvas-webgl/blob/master/canvas-webgl.js\n\t\t//bring angles all in [0, 2*PI] range\n\t\tif (startAngle === endAngle) {\n\t\t\treturn;\n\t\t}\n\t\tconst fullCircle = anticlockwise\n\t\t\t? Math.abs(startAngle - endAngle) >= TAU\n\t\t\t: Math.abs(endAngle - startAngle) >= TAU;\n\n\t\tstartAngle = startAngle % TAU;\n\t\tendAngle = endAngle % TAU;\n\n\t\tif (startAngle < 0) {\n\t\t\tstartAngle += TAU;\n\t\t}\n\t\tif (endAngle < 0) {\n\t\t\tendAngle += TAU;\n\t\t}\n\n\t\tif (startAngle >= endAngle) {\n\t\t\tendAngle += TAU;\n\t\t}\n\n\t\tlet diff = endAngle - startAngle;\n\t\tlet direction = 1;\n\t\tif (anticlockwise) {\n\t\t\tdirection = -1;\n\t\t\tdiff = TAU - diff;\n\t\t}\n\n\t\tif (fullCircle) {\n\t\t\tdiff = TAU;\n\t\t}\n\n\t\tconst length = diff * radius;\n\t\tconst nr_of_interpolation_points = length / this.arcResolution;\n\t\tconst dangle = diff / nr_of_interpolation_points;\n\t\tconst angleStep = dangle * direction;\n\n\t\tthis.moveTo(\n\t\t\tx + radius * Math.cos(startAngle),\n\t\t\ty + radius * Math.sin(startAngle),\n\t\t);\n\n\t\tlet angle = startAngle;\n\t\tfor (let j = 0; j < nr_of_interpolation_points; j++) {\n\t\t\tthis.lineTo(x + radius * Math.cos(angle), y + radius * Math.sin(angle));\n\t\t\tangle += angleStep;\n\t\t}\n\n\t\tthis.lineTo(\n\t\t\tx + radius * Math.cos(endAngle),\n\t\t\ty + radius * Math.sin(endAngle),\n\t\t);\n\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * adds a circular arc to the path with the given control points and radius, connected to the previous point by a straight line.\n\t * @param {number} x1 - the x-axis coordinate of the first control point.\n\t * @param {number} y1 - the y-axis coordinate of the first control point.\n\t * @param {number} x2 - the x-axis coordinate of the second control point.\n\t * @param {number} y2 - the y-axis coordinate of the second control point.\n\t * @param {number} radius - the arc's radius. Must be positive.\n\t */\n\tarcTo(x1, y1, x2, y2, radius) {\n\t\tconst points = this.points;\n\t\tconst startPoint = this.startPoint;\n\t\tconst lastPoint =\n\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\n\t\t// based on from https://github.com/karellodewijk/canvas-webgl/blob/master/canvas-webgl.js\n\t\tconst x0 = lastPoint.x;\n\t\tconst y0 = lastPoint.y;\n\t\t//a = -incoming vector, b = outgoing vector to x1, y1\n\t\tlet a0 = x0 - x1;\n\t\tlet a1 = y0 - y1;\n\t\tlet b0 = x2 - x1;\n\t\tlet b1 = y2 - y1;\n\n\t\t//normalize\n\t\tconst l_a = Math.sqrt(Math.pow(a0, 2) + Math.pow(a1, 2));\n\t\tconst l_b = Math.sqrt(Math.pow(b0, 2) + Math.pow(b1, 2));\n\t\ta0 /= l_a;\n\t\ta1 /= l_a;\n\t\tb0 /= l_b;\n\t\tb1 /= l_b;\n\t\tconst angle = Math.atan2(a1, a0) - Math.atan2(b1, b0);\n\n\t\t//work out tangent points using tan(\u03B8) = opposite / adjacent; angle/2 because hypotenuse is the bisection of a,b\n\t\tconst tan_angle_div2 = Math.tan(angle / 2);\n\t\tconst adj_l = radius / tan_angle_div2;\n\n\t\tconst tangent1_pointx = x1 + a0 * adj_l;\n\t\tconst tangent1_pointy = y1 + a1 * adj_l;\n\t\tconst tangent2_pointx = x1 + b0 * adj_l;\n\t\tconst tangent2_pointy = y1 + b1 * adj_l;\n\n\t\tthis.moveTo(tangent1_pointx, tangent1_pointy);\n\n\t\tlet bisec0 = (a0 + b0) / 2.0;\n\t\tlet bisec1 = (a1 + b1) / 2.0;\n\t\tconst bisec_l = Math.sqrt(Math.pow(bisec0, 2) + Math.pow(bisec1, 2));\n\t\tbisec0 /= bisec_l;\n\t\tbisec1 /= bisec_l;\n\n\t\tconst hyp_l = Math.sqrt(Math.pow(radius, 2) + Math.pow(adj_l, 2));\n\t\tconst centerx = x1 + hyp_l * bisec0;\n\t\tconst centery = y1 + hyp_l * bisec1;\n\n\t\tconst startAngle = Math.atan2(\n\t\t\ttangent1_pointy - centery,\n\t\t\ttangent1_pointx - centerx,\n\t\t);\n\t\tconst endAngle = Math.atan2(\n\t\t\ttangent2_pointy - centery,\n\t\t\ttangent2_pointx - centerx,\n\t\t);\n\n\t\tthis.arc(centerx, centery, radius, startAngle, endAngle);\n\t}\n\n\t/**\n\t * adds an elliptical arc to the path which is centered at (x, y) position with the radii radiusX and radiusY\n\t * starting at startAngle and ending at endAngle going in the given direction by counterclockwise.\n\t * @param {number} x - the x-axis (horizontal) coordinate of the ellipse's center.\n\t * @param {number} y - the y-axis (vertical) coordinate of the ellipse's center.\n\t * @param {number} radiusX - the ellipse's major-axis radius. Must be non-negative.\n\t * @param {number} radiusY - the ellipse's minor-axis radius. Must be non-negative.\n\t * @param {number} rotation - the rotation of the ellipse, expressed in radians.\n\t * @param {number} startAngle - the angle at which the ellipse starts, measured clockwise from the positive x-axis and expressed in radians.\n\t * @param {number} endAngle - the angle at which the ellipse ends, measured clockwise from the positive x-axis and expressed in radians.\n\t * @param {boolean} [anticlockwise=false] - an optional boolean value which, if true, draws the ellipse counterclockwise (anticlockwise).\n\t */\n\tellipse(\n\t\tx,\n\t\ty,\n\t\tradiusX,\n\t\tradiusY,\n\t\trotation,\n\t\tstartAngle,\n\t\tendAngle,\n\t\tanticlockwise = false,\n\t) {\n\t\t// based on from https://github.com/karellodewijk/canvas-webgl/blob/master/canvas-webgl.js\n\t\tif (startAngle === endAngle) {\n\t\t\treturn;\n\t\t}\n\t\tconst fullCircle = anticlockwise\n\t\t\t? Math.abs(startAngle - endAngle) >= TAU\n\t\t\t: Math.abs(endAngle - startAngle) >= TAU;\n\n\t\t//bring angles all in [0, 2*PI] range\n\t\tstartAngle = startAngle % TAU;\n\t\tendAngle = endAngle % TAU;\n\t\tif (startAngle < 0) {\n\t\t\tstartAngle += TAU;\n\t\t}\n\t\tif (endAngle < 0) {\n\t\t\tendAngle += TAU;\n\t\t}\n\n\t\tif (startAngle >= endAngle) {\n\t\t\tendAngle += TAU;\n\t\t}\n\n\t\tlet diff = endAngle - startAngle;\n\n\t\tlet direction = 1;\n\t\tif (anticlockwise) {\n\t\t\tdirection = -1;\n\t\t\tdiff = TAU - diff;\n\t\t}\n\n\t\tif (fullCircle) {\n\t\t\tdiff = TAU;\n\t\t}\n\n\t\tconst length = (diff * radiusX + diff * radiusY) / 2;\n\t\tconst nr_of_interpolation_points = length / this.arcResolution;\n\t\tconst dangle = diff / nr_of_interpolation_points;\n\t\tconst angleStep = dangle * direction;\n\n\t\tlet angle = startAngle;\n\t\tconst cos_rotation = Math.cos(rotation);\n\t\tconst sin_rotation = Math.sin(rotation);\n\n\t\tthis.moveTo(\n\t\t\tx + radiusX * Math.cos(startAngle),\n\t\t\ty + radiusY * Math.sin(startAngle),\n\t\t);\n\n\t\tfor (let j = 0; j < nr_of_interpolation_points; j++) {\n\t\t\tconst _x1 = radiusX * Math.cos(angle);\n\t\t\tconst _y1 = radiusY * Math.sin(angle);\n\t\t\tconst _x2 = x + _x1 * cos_rotation - _y1 * sin_rotation;\n\t\t\tconst _y2 = y + _x1 * sin_rotation + _y1 * cos_rotation;\n\t\t\tthis.lineTo(_x2, _y2);\n\t\t\tangle += angleStep;\n\t\t}\n\t\t// close the ellipse\n\t\tthis.lineTo(\n\t\t\tx + radiusX * Math.cos(startAngle),\n\t\t\ty + radiusY * Math.sin(startAngle),\n\t\t);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * Adds a quadratic B\u00E9zier curve to the path.\n\t * @param {number} cpX - The x-coordinate of the control point.\n\t * @param {number} cpY - The y-coordinate of the control point.\n\t * @param {number} x - The x-coordinate of the end point of the curve.\n\t * @param {number} y - The y-coordinate of the end point of the curve.\n\t */\n\tquadraticCurveTo(cpX, cpY, x, y) {\n\t\tconst points = this.points;\n\t\tconst startPoint = this.startPoint;\n\t\tconst lastPoint =\n\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\t\tconst endPoint = pointPool.get().set(x, y);\n\t\tconst controlPoint = pointPool.get().set(cpX, cpY);\n\t\tconst resolution = this.arcResolution;\n\n\t\tconst t = 1 / resolution;\n\t\tfor (let i = 1; i <= resolution; i++) {\n\t\t\tthis.lineTo(\n\t\t\t\tlastPoint.x * Math.pow(1 - t * i, 2) +\n\t\t\t\t\tcontrolPoint.x * 2 * (1 - t * i) * t * i +\n\t\t\t\t\tendPoint.x * Math.pow(t * i, 2),\n\t\t\t\tlastPoint.y * Math.pow(1 - t * i, 2) +\n\t\t\t\t\tcontrolPoint.y * 2 * (1 - t * i) * t * i +\n\t\t\t\t\tendPoint.y * Math.pow(t * i, 2),\n\t\t\t);\n\t\t}\n\t\tpointPool.release(endPoint);\n\t\tpointPool.release(controlPoint);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * Adds a cubic B\u00E9zier curve to the path.\n\t * @param {number} cp1X - The x-coordinate of the first control point.\n\t * @param {number} cp1Y - The y-coordinate of the first control point.\n\t * @param {number} cp2X - The x-coordinate of the second control point.\n\t * @param {number} cp2Y - The y-coordinate of the second control point.\n\t * @param {number} x - The x-coordinate of the end point of the curve.\n\t * @param {number} y - The y-coordinate of the end point of the curve.\n\t */\n\tbezierCurveTo(cp1X, cp1Y, cp2X, cp2Y, x, y) {\n\t\tconst points = this.points;\n\t\tconst startPoint = this.startPoint;\n\t\tconst lastPoint =\n\t\t\tpoints.length === 0 ? startPoint : points[points.length - 1];\n\t\tconst endPoint = pointPool.get().set(x, y);\n\t\tconst controlPoint1 = pointPool.get().set(cp1X, cp1Y);\n\t\tconst controlPoint2 = pointPool.get().set(cp2X, cp2Y);\n\t\tconst resolution = this.arcResolution;\n\n\t\tconst t = 1 / resolution;\n\t\tfor (let i = 1; i <= resolution; i++) {\n\t\t\tthis.lineTo(\n\t\t\t\tlastPoint.x * Math.pow(1 - t * i, 3) +\n\t\t\t\t\tcontrolPoint1.x * 3 * Math.pow(1 - t * i, 2) * t * i +\n\t\t\t\t\tcontrolPoint2.x * 3 * (1 - t * i) * Math.pow(t * i, 2) +\n\t\t\t\t\tendPoint.x * Math.pow(t * i, 3),\n\t\t\t\tlastPoint.y * Math.pow(1 - t * i, 3) +\n\t\t\t\t\tcontrolPoint1.y * 3 * Math.pow(1 - t * i, 2) * t * i +\n\t\t\t\t\tcontrolPoint2.y * 3 * (1 - t * i) * Math.pow(t * i, 2) +\n\t\t\t\t\tendPoint.y * Math.pow(t * i, 3),\n\t\t\t);\n\t\t}\n\n\t\tpointPool.release(endPoint, controlPoint1, controlPoint2);\n\t\tpointPool.release(controlPoint1);\n\t\tpointPool.release(controlPoint2);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * creates a path for a rectangle at position (x, y) with a size that is determined by width and height.\n\t * @param {number} x - the x-axis coordinate of the rectangle's starting point.\n\t * @param {number} y - the y-axis coordinate of the rectangle's starting point.\n\t * @param {number} width - the rectangle's width. Positive values are to the right, and negative to the left.\n\t * @param {number} height - the rectangle's height. Positive values are down, and negative are up.\n\t */\n\trect(x, y, width, height) {\n\t\tthis.moveTo(x, y);\n\t\tthis.lineTo(x + width, y);\n\n\t\tthis.moveTo(x + width, y);\n\t\tthis.lineTo(x + width, y + height);\n\n\t\tthis.moveTo(x + width, y + height);\n\t\tthis.lineTo(x, y + height);\n\n\t\tthis.moveTo(x, y + height);\n\t\tthis.lineTo(x, y);\n\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * adds an rounded rectangle to the current path.\n\t * @param {number} x - the x-axis coordinate of the rectangle's starting point.\n\t * @param {number} y - the y-axis coordinate of the rectangle's starting point.\n\t * @param {number} width - the rectangle's width. Positive values are to the right, and negative to the left.\n\t * @param {number} height - the rectangle's height. Positive values are down, and negative are up.\n\t * @param {number} radius - the arc's radius to draw the borders. Must be positive.\n\t */\n\troundRect(x, y, width, height, radius) {\n\t\tthis.moveTo(x + radius, y);\n\t\tthis.lineTo(x + width - radius, y);\n\t\tthis.arcTo(x + width, y, x + width, y + radius, radius);\n\n\t\tthis.moveTo(x + width, y + radius);\n\t\tthis.lineTo(x + width, y + height - radius);\n\t\tthis.arcTo(x + width, y + height, x + width - radius, y + height, radius);\n\n\t\tthis.moveTo(x + width - radius, y + height);\n\t\tthis.lineTo(x + radius, y + height);\n\t\tthis.arcTo(x, y + height, x, y + height - radius, radius);\n\n\t\tthis.moveTo(x, y + height - radius);\n\t\tthis.lineTo(x, y + radius);\n\t\tthis.arcTo(x, y, x + radius, y, radius);\n\n\t\tthis.isDirty = true;\n\t}\n}\n\nexport default Path2D;\n", "import { clamp } from \"../../math/math.ts\";\nimport { setPrefixed } from \"../../utils/agent.ts\";\nimport { createCanvas } from \"../video.js\";\n\n/**\n * additional import for TypeScript\n * @import CanvasRenderer from \"./../canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../webgl/webgl_renderer.js\";\n */\n\n// default canvas settings\nconst defaultAttributes = {\n\toffscreenCanvas: false,\n\twillReadFrequently: false,\n\tantiAlias: false,\n\tcontext: \"2d\",\n\ttransparent: false,\n\tpremultipliedAlpha: true,\n\tstencil: true,\n\tblendMode: \"normal\",\n\tfailIfMajorPerformanceCaveat: true,\n\tpreferWebGL1: false,\n\tpowerPreference: \"default\",\n};\n\n// WebGL version (if a gl context is created)\nlet WebGLVersion;\n\n// a helper function to create the 2d/webgl context\nfunction createContext(canvas, attributes) {\n\tlet context;\n\n\tif (attributes.context === \"2d\") {\n\t\t// 2d/canvas mode\n\t\tcontext = canvas.getContext(attributes.context, {\n\t\t\twillReadFrequently: attributes.willReadFrequently,\n\t\t});\n\t} else if (attributes.context === \"webgl\") {\n\t\tconst attr = {\n\t\t\talpha: attributes.transparent,\n\t\t\tantialias: attributes.antiAlias,\n\t\t\tdepth: attributes.depth,\n\t\t\tstencil: true,\n\t\t\tpreserveDrawingBuffer: false,\n\t\t\tpremultipliedAlpha: attributes.transparent\n\t\t\t\t? attributes.premultipliedAlpha\n\t\t\t\t: false,\n\t\t\tpowerPreference: attributes.powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: attributes.failIfMajorPerformanceCaveat,\n\t\t};\n\n\t\t// attempt to create a WebGL2 context unless not requested\n\t\tif (attributes.preferWebGL1 !== true) {\n\t\t\tcontext = canvas.getContext(\"webgl2\", attr);\n\t\t\tif (context) {\n\t\t\t\tWebGLVersion = 2;\n\t\t\t}\n\t\t}\n\n\t\t// fallback to WebGL1\n\t\tif (!context) {\n\t\t\tWebGLVersion = 1;\n\t\t\tcontext =\n\t\t\t\tcanvas.getContext(\"webgl\", attr) ||\n\t\t\t\tcanvas.getContext(\"experimental-webgl\", attr);\n\t\t}\n\n\t\tif (!context) {\n\t\t\tthrow new Error(\"A WebGL context could not be created.\");\n\t\t}\n\t} else {\n\t\tthrow new Error(\"Invalid context type. Must be one of '2d' or 'webgl'\");\n\t}\n\n\t// set the context size\n\treturn context;\n}\n\n/**\n * CanvasRenderTarget is 2D render target which exposes a Canvas interface.\n */\nclass CanvasRenderTarget {\n\t/**\n\t * @param {number} width - the desired width of the canvas\n\t * @param {number} height - the desired height of the canvas\n\t * @param {object} attributes - The attributes to create both the canvas and context\n\t * @param {string} [attributes.context=\"2d\"] - the context type to be created (\"2d\", \"webgl\")\n\t * @param {boolean} [attributes.preferWebGL1=false] - set to true for force using WebGL1 instead of WebGL2 (if supported)\n\t * @param {boolean} [attributes.transparent=false] - specify if the canvas contains an alpha channel\n\t * @param {boolean} [attributes.offscreenCanvas=false] - will create an offscreenCanvas if true instead of a standard canvas\n\t * @param {boolean} [attributes.willReadFrequently=false] - Indicates whether or not a lot of read-back operations are planned\n\t * @param {boolean} [attributes.antiAlias=false] - Whether to enable anti-aliasing, use false (default) for a pixelated effect.\n\t */\n\tconstructor(width, height, attributes = defaultAttributes) {\n\t\t/**\n\t\t * the canvas created for this CanvasRenderTarget\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\t// this.canvas;\n\n\t\t/**\n\t\t * the rendering context of this CanvasRenderTarget\n\t\t * @type {CanvasRenderingContext2D|WebGLRenderingContext}\n\t\t */\n\t\t// this.context;\n\t\t// clean up the given attributes\n\t\tthis.attributes = Object.assign({}, defaultAttributes, attributes);\n\n\t\t// make sure context is defined\n\t\tif (typeof attributes.context === \"undefined\") {\n\t\t\tattributes.context = \"2d\";\n\t\t}\n\n\t\t// used the given canvas if any\n\t\tif (typeof attributes.canvas !== \"undefined\") {\n\t\t\tthis.canvas = attributes.canvas;\n\t\t} else {\n\t\t\tthis.canvas = createCanvas(\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tthis.attributes.offscreenCanvas,\n\t\t\t);\n\t\t}\n\n\t\t// create the context\n\t\tthis.context = createContext(this.canvas, this.attributes);\n\n\t\tthis.WebGLVersion = WebGLVersion;\n\n\t\t// enable or disable antiAlias if specified\n\t\tthis.setAntiAlias(this.attributes.antiAlias);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonResetEvent(width, height) {\n\t\tthis.clear();\n\t\tthis.resize(width, height);\n\t}\n\n\t/**\n\t * Clears the content of the canvas texture\n\t */\n\tclear() {\n\t\tthis.context.setTransform(1, 0, 0, 1, 0, 0);\n\t\tthis.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t}\n\n\t/**\n\t * enable/disable image smoothing (scaling interpolation)\n\t * @param {boolean} [enable=false] - whether to enable or not image smoothing (scaling interpolation)\n\t */\n\tsetAntiAlias(enable = false) {\n\t\tconst canvas = this.canvas;\n\n\t\t// enable/disable antialias on the given Context2d object\n\t\tsetPrefixed(\"imageSmoothingEnabled\", enable, this.context);\n\n\t\t// set antialias CSS property on the main canvas\n\t\tif (typeof canvas.style !== \"undefined\") {\n\t\t\tif (enable !== true) {\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"optimizeSpeed\"; // legal fallback\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"-moz-crisp-edges\"; // Firefox\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"-o-crisp-edges\"; // Opera\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"-webkit-optimize-contrast\"; // Safari\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"optimize-contrast\"; // CSS 3\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"crisp-edges\"; // CSS 4\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"pixelated\"; // CSS 4\n\t\t\t\tcanvas.style.msInterpolationMode = \"nearest-neighbor\"; // IE8+\n\t\t\t} else {\n\t\t\t\tcanvas.style[\"image-rendering\"] = \"auto\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Resizes the canvas texture to the given width and height.\n\t * @param {number} width - the desired width\n\t * @param {number} height - the desired height\n\t */\n\tresize(width, height) {\n\t\tthis.canvas.width = Math.round(width);\n\t\tthis.canvas.height = Math.round(height);\n\t}\n\n\t/**\n\t * Returns an ImageData object representing the underlying pixel data for a specified portion of this canvas texture.\n\t * (Note: when using getImageData(), it is highly recommended to use the `willReadFrequently` attribute when creatimg the corresponding canvas texture)\n\t * @param {number} x - The x-axis coordinate of the top-left corner of the rectangle from which the ImageData will be extracted\n\t * @param {number} y - The y-axis coordinate of the top-left corner of the rectangle from which the ImageData will be extracted\n\t * @param {number} width - The width of the rectangle from which the ImageData will be extracted. Positive values are to the right, and negative to the left\n\t * @param {number} height - The height of the rectangle from which the ImageData will be extracted. Positive values are down, and negative are up\n\t * @returns {ImageData} The ImageData extracted from this CanvasRenderTarget.\n\t */\n\tgetImageData(x, y, width, height) {\n\t\t// clamp values\n\t\tx = clamp(Math.floor(x), 0, this.canvas.width - 1);\n\t\ty = clamp(Math.floor(y), 0, this.canvas.height - 1);\n\t\twidth = clamp(width, 1, this.canvas.width - x);\n\t\theight = clamp(height, 1, this.canvas.height - y);\n\t\t// return imageData\n\t\treturn this.context.getImageData(x, y, width, height);\n\t}\n\n\t/**\n\t * creates a Blob object representing the image contained in this canvas texture\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning a Blob object representing the image contained in this canvas texture\n\t * @example\n\t * renderTarget.convertToBlob().then((blob) => console.log(blob));\n\t */\n\ttoBlob(type = \"image/png\", quality) {\n\t\tif (typeof this.canvas.convertToBlob === \"function\") {\n\t\t\treturn this.canvas.convertToBlob({ type, quality });\n\t\t} else {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.canvas.toBlob(\n\t\t\t\t\t(blob) => {\n\t\t\t\t\t\tresolve(blob);\n\t\t\t\t\t},\n\t\t\t\t\ttype,\n\t\t\t\t\tquality,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * creates an ImageBitmap object from the most recently rendered image of this canvas texture\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning an ImageBitmap.\n\t * @example\n\t * renderTarget.transferToImageBitmap().then((bitmap) => console.log(bitmap));\n\t */\n\ttoImageBitmap(type = \"image/png\", quality) {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (typeof this.canvas.transferToImageBitmap === \"function\") {\n\t\t\t\tresolve(this.canvas.transferToImageBitmap());\n\t\t\t} else {\n\t\t\t\tconst image = new Image();\n\t\t\t\timage.src = this.canvas.toDataURL(type, quality);\n\t\t\t\timage.onload = () => {\n\t\t\t\t\tglobalThis.createImageBitmap(image).then((bitmap) => {\n\t\t\t\t\t\treturn resolve(bitmap);\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * returns a data URL containing a representation of the most recently rendered image of this canvas texture\n\t * (not supported by OffscreenCanvas)\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning a string containing the requested data URL.\n\t * @example\n\t * renderer.toDataURL().then((dataURL) => console.log(dataURL));\n\t */\n\ttoDataURL(type = \"image/png\", quality) {\n\t\treturn new Promise((resolve) => {\n\t\t\tresolve(this.canvas.toDataURL(type, quality));\n\t\t});\n\t}\n\n\t/**\n\t * invalidate the current CanvasRenderTarget, and force a reupload of the corresponding texture\n\t * (call this if you modify the canvas content between two draw calls)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - the renderer to which this canvas texture is attached\n\t */\n\tinvalidate(renderer) {\n\t\tif (typeof renderer.gl !== \"undefined\") {\n\t\t\t// make sure the right compositor is active\n\t\t\trenderer.setCompositor(\"quad\");\n\t\t\t// invalidate the previous corresponding texture so that it can reuploaded once changed\n\t\t\tthis.glTextureUnit = renderer.cache.getUnit(\n\t\t\t\trenderer.cache.get(this.canvas),\n\t\t\t);\n\t\t\trenderer.currentCompositor.unbindTexture2D(null, this.glTextureUnit);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tthis.context = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\t/**\n\t * The width of this canvas texture in pixels\n\t * @public\n\t * @type {number}\n\t */\n\tget width() {\n\t\treturn this.canvas.width;\n\t}\n\n\tset width(val) {\n\t\tthis.canvas.width = Math.round(val);\n\t}\n\n\t/**\n\t * The height of this canvas texture in pixels\n\t * @public\n\t * @type {number}\n\t */\n\tget height() {\n\t\treturn this.canvas.height;\n\t}\n\n\tset height(val) {\n\t\tthis.canvas.height = Math.round(val);\n\t}\n}\n\nexport default CanvasRenderTarget;\n", "import Path2D from \"./../geometries/path2d.js\";\nimport { Color } from \"./../math/color.ts\";\nimport { Matrix3d } from \"../math/matrix3d.ts\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport { CANVAS_ONRESIZE, eventEmitter } from \"../system/event.ts\";\nimport CanvasRenderTarget from \"./rendertarget/canvasrendertarget.js\";\n\n/**\n * @import {Rect} from \"./../geometries/rectangle.ts\";\n * @import {RoundRect} from \"./../geometries/roundrect.ts\";\n * @import {Polygon} from \"../geometries/polygon.ts\";\n * @import {Line} from \"./../geometries/line.ts\";\n * @import {Ellipse} from \"./../geometries/ellipse.ts\";\n * @import {Bounds} from \"./../physics/bounds.ts\";\n */\n\n/**\n * a base renderer object\n */\nexport default class Renderer {\n\t/**\n\t * @param {ApplicationSettings} [options] - optional parameters for the renderer\n\t */\n\tconstructor(options) {\n\t\t/**\n\t\t * The renderer renderTarget\n\t\t * @name renderTarget\n\t\t * @type {CanvasRenderTarget}\n\t\t */\n\t\tthis.renderTarget = new CanvasRenderTarget(\n\t\t\toptions.width,\n\t\t\toptions.height,\n\t\t\t// support case when a global canvas is available, e.g. webapp adapter for wechat\n\t\t\ttypeof globalThis.canvas !== \"undefined\"\n\t\t\t\t? Object.assign(options, { canvas: globalThis.canvas })\n\t\t\t\t: options,\n\t\t);\n\n\t\t/**\n\t\t * The given constructor options\n\t\t * @public\n\t\t * @type {object}\n\t\t */\n\t\tthis.settings = options;\n\n\t\t/**\n\t\t * the requested video size ratio\n\t\t * @public\n\t\t * @type {number}\n\t\t */\n\t\tthis.designRatio = this.settings.width / this.settings.height;\n\n\t\t/**\n\t\t * the scaling ratio to be applied to the main canvas\n\t\t * @type {Vector2d}\n\t\t * @default <1,1>\n\t\t */\n\t\tthis.scaleRatio = new Vector2d(this.settings.scale, this.settings.scale);\n\n\t\t/**\n\t\t * true if the current rendering context is valid\n\t\t * @default true\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isContextValid = true;\n\n\t\t/**\n\t\t * the default method to sort object (\"sorting\", \"z-buffer\")\n\t\t * @type {string}\n\t\t * @default \"sorting\"\n\t\t */\n\t\tthis.depthTest = \"sorting\";\n\n\t\t/**\n\t\t * The Path2D instance used by the renderer to draw primitives\n\t\t * @type {Path2D}\n\t\t */\n\t\tthis.path2D = new Path2D();\n\n\t\t/**\n\t\t * The renderer type : Canvas, WebGL, etc...\n\t\t * (override this property with a specific value when implementing a custom renderer)\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = \"Generic\";\n\n\t\t/**\n\t\t * The background color used to clear the main framebuffer.\n\t\t * Note: alpha value will be set based on the transparent property of the renderer settings.\n\t\t * @default black\n\t\t * @type {Color}\n\t\t */\n\t\tthis.backgroundColor = new Color(\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tthis.settings.transparent ? 0.0 : 1.0,\n\t\t);\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis.currentScissor = new Int32Array([\n\t\t\t0,\n\t\t\t0,\n\t\t\tthis.settings.width,\n\t\t\tthis.settings.height,\n\t\t]);\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis.maskLevel = 0;\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis.currentBlendMode = \"none\";\n\n\t\t// global color\n\t\tthis.currentColor = new Color(0, 0, 0, 1.0);\n\n\t\t// global tint color\n\t\tthis.currentTint = new Color(255, 255, 255, 1.0);\n\n\t\t// the projectionMatrix (set through setProjection)\n\t\tthis.projectionMatrix = new Matrix3d();\n\n\t\t// default uvOffset\n\t\tthis.uvOffset = 0;\n\t}\n\n\t/**\n\t * return the height of the canvas which this renderer draws to\n\t * @returns {number} height of the system Canvas\n\t */\n\tget height() {\n\t\treturn this.getCanvas().height;\n\t}\n\n\tset height(value) {\n\t\tthis.resize(this.width, value);\n\t}\n\n\t/**\n\t * return the width of the canvas which this renderer draws to\n\t * @returns {number} width of the system Canvas\n\t */\n\tget width() {\n\t\treturn this.getCanvas().width;\n\t}\n\n\tset width(value) {\n\t\tthis.resize(value, this.height);\n\t}\n\n\t/**\n\t * prepare the framebuffer for drawing a new frame\n\t */\n\tclear() {}\n\n\t/**\n\t * render the main framebuffer on screen\n\t */\n\tflush() {}\n\n\t/**\n\t * Reset context state\n\t */\n\treset() {\n\t\tthis.resetTransform();\n\t\tthis.setBlendMode(this.settings.blendMode);\n\t\tthis.setColor(\"#000000\");\n\t\tthis.clearTint();\n\t\tthis.cache.clear();\n\t\tthis.currentScissor[0] = 0;\n\t\tthis.currentScissor[1] = 0;\n\t\tthis.currentScissor[2] = this.width;\n\t\tthis.currentScissor[3] = this.height;\n\t\tthis.clearMask();\n\t}\n\n\t/**\n\t * return a reference to the current render target corresponding canvas which this renderer draws to\n\t * @returns {HTMLCanvasElement}\n\t */\n\tgetCanvas() {\n\t\treturn this.renderTarget.canvas;\n\t}\n\n\t/**\n\t * return a reference to the current render target corresponding Context\n\t * @returns {CanvasRenderingContext2D|WebGLRenderingContext}\n\t */\n\tgetContext() {\n\t\treturn this.renderTarget.context;\n\t}\n\n\t/**\n\t * returns the current blend mode for this renderer\n\t * @returns {string} blend mode\n\t */\n\tgetBlendMode() {\n\t\treturn this.currentBlendMode;\n\t}\n\n\t/**\n\t * get the current fill & stroke style color.\n\t * @returns {Color} current global color\n\t */\n\tgetColor() {\n\t\treturn this.currentColor;\n\t}\n\n\t/**\n\t * return the current global alpha\n\t * @returns {number}\n\t */\n\tglobalAlpha() {\n\t\treturn this.currentColor.glArray[3];\n\t}\n\n\t/**\n\t * check if the given rect or bounds overlaps with the renderer screen coordinates\n\t * @param {Rect|Bounds} bounds\n\t * @returns {boolean} true if overlaps\n\t */\n\toverlaps(bounds) {\n\t\treturn (\n\t\t\tbounds.left <= this.width &&\n\t\t\tbounds.right >= 0 &&\n\t\t\tbounds.top <= this.height &&\n\t\t\tbounds.bottom >= 0\n\t\t);\n\t}\n\n\t/**\n\t * resizes the system canvas\n\t * @param {number} width - new width of the canvas\n\t * @param {number} height - new height of the canvas\n\t */\n\tresize(width, height) {\n\t\tconst canvas = this.getCanvas();\n\t\tif (width !== canvas.width || height !== canvas.height) {\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tthis.currentScissor[0] = 0;\n\t\t\tthis.currentScissor[1] = 0;\n\t\t\tthis.currentScissor[2] = width;\n\t\t\tthis.currentScissor[3] = height;\n\t\t\t// publish the corresponding event\n\t\t\teventEmitter.emit(CANVAS_ONRESIZE, width, height);\n\t\t}\n\t}\n\n\t/**\n\t * enable/disable image smoothing (scaling interpolation) for the current render target\n\t * @param {boolean} [enable=false]\n\t */\n\tsetAntiAlias(enable = false) {\n\t\tthis.renderTarget.setAntiAlias(enable);\n\t}\n\n\t/**\n\t * set/change the current projection matrix (WebGL only)\n\t * @param {Matrix3d} matrix\n\t */\n\tsetProjection(matrix) {\n\t\tthis.projectionMatrix.copy(matrix);\n\t}\n\n\t/**\n\t * stroke the given shape\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} shape - a shape object to stroke\n\t * @param {boolean} [fill=false] - fill the shape with the current color if true\n\t */\n\tstroke(shape, fill) {\n\t\tswitch (shape.type) {\n\t\t\t// RoundRect\n\t\t\tcase \"RoundRect\":\n\t\t\t\tthis.strokeRoundRect(\n\t\t\t\t\tshape.left,\n\t\t\t\t\tshape.top,\n\t\t\t\t\tshape.width,\n\t\t\t\t\tshape.height,\n\t\t\t\t\tshape.radius,\n\t\t\t\t\tfill,\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\t// Rect or Bounds\n\t\t\tcase \"Rectangle\":\n\t\t\tcase \"Bounds\":\n\t\t\t\tthis.strokeRect(shape.left, shape.top, shape.width, shape.height, fill);\n\t\t\t\tbreak;\n\n\t\t\t// Polygon or Line\n\t\t\tcase \"Polygon\":\n\t\t\tcase \"Line\":\n\t\t\t\tthis.strokePolygon(shape, fill);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Ellipse\":\n\t\t\t\tthis.strokeEllipse(\n\t\t\t\t\tshape.pos.x,\n\t\t\t\t\tshape.pos.y,\n\t\t\t\t\tshape.radiusV.x,\n\t\t\t\t\tshape.radiusV.y,\n\t\t\t\t\tfill,\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\t// Point\n\t\t\tcase \"Point\":\n\t\t\t\tthis.strokePoint(shape.x, shape.y);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Invalid geometry for fill/stroke\");\n\t\t}\n\t}\n\n\t/**\n\t * fill the given shape\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} shape - a shape object to fill\n\t */\n\tfill(shape) {\n\t\tthis.stroke(shape, true);\n\t}\n\n\t/**\n\t * tint the given image or canvas using the given color\n\t * @param {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas} src - the source image to be tinted\n\t * @param {Color|string} color - the color that will be used to tint the image\n\t * @param {string} [mode=\"multiply\"] - the composition mode used to tint the image\n\t * @returns {HTMLCanvasElement|OffscreenCanvas} a new canvas or offscreencanvas (if supported) element representing the tinted image\n\t */\n\ttint(src, color, mode = \"multiply\") {\n\t\tconst attributes = {\n\t\t\tcontext: \"2d\",\n\t\t\toffscreenCanvas: true,\n\t\t\ttransparent: true,\n\t\t\tantiAlias: this.settings.antiAlias,\n\t\t};\n\t\tconst canvasTexture = new CanvasRenderTarget(\n\t\t\tsrc.width,\n\t\t\tsrc.height,\n\t\t\tattributes,\n\t\t);\n\t\tconst context = canvasTexture.context;\n\n\t\tcontext.fillStyle = color instanceof Color ? color.toRGB() : color;\n\t\tcontext.fillRect(0, 0, src.width, src.height);\n\n\t\tcontext.globalCompositeOperation = mode;\n\t\tcontext.drawImage(src, 0, 0);\n\t\tcontext.globalCompositeOperation = \"destination-atop\";\n\t\tcontext.drawImage(src, 0, 0);\n\n\t\treturn canvasTexture.canvas;\n\t}\n\n\t/**\n\t * A mask limits rendering elements to the shape and position of the given mask object.\n\t * So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.\n\t * Mask are not preserved through renderer context save and restore.\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] - the shape defining the mask to be applied\n\t * @param {boolean} [invert=false] - either the given shape should define what is visible (default) or the opposite\n\t */\n\tsetMask() {}\n\n\t/**\n\t * disable (remove) the rendering mask set through setMask.\n\t * @see Renderer#setMask\n\t */\n\tclearMask() {}\n\n\t/**\n\t * set a coloring tint for sprite based renderables\n\t * @param {Color} tint - the tint color\n\t * @param {number} [alpha] - an alpha value to be applied to the tint\n\t */\n\tsetTint(tint, alpha = tint.alpha) {\n\t\t// global tint color\n\t\tthis.currentTint.copy(tint);\n\t\tthis.currentTint.alpha *= alpha;\n\t}\n\n\t/**\n\t * clear the rendering tint set through setTint.\n\t * @see Renderer#setTint\n\t */\n\tclearTint() {\n\t\t// reset to default\n\t\tthis.currentTint.setFloat(1.0, 1.0, 1.0, 1.0);\n\t}\n\n\t/**\n\t * creates a Blob object representing the last rendered frame\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning a Blob object representing the last rendered frame\n\t * @example\n\t * renderer.convertToBlob().then((blob) => console.log(blob));\n\t */\n\ttoBlob(type = \"image/png\", quality) {\n\t\treturn this.renderTarget.toBlob(type, quality);\n\t}\n\n\t/**\n\t * creates an ImageBitmap object of the last frame rendered\n\t * (not supported by standard Canvas)\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning an ImageBitmap.\n\t * @example\n\t * renderer.transferToImageBitmap().then((image) => console.log(image));\n\t */\n\ttoImageBitmap(type = \"image/png\", quality) {\n\t\treturn this.renderTarget.toImageBitmap(type, quality);\n\t}\n\n\t/**\n\t * returns a data URL containing a representation of the last frame rendered\n\t * @param {string} [type=\"image/png\"] - A string indicating the image format\n\t * @param {number} [quality] - A Number between 0 and 1 indicating the image quality to be used when creating images using file formats that support lossy compression (such as image/jpeg or image/webp). A user agent will use its default quality value if this option is not specified, or if the number is outside the allowed range.\n\t * @returns {Promise} A Promise returning a string containing the requested data URL.\n\t * @example\n\t * renderer.toDataURL().then((dataURL) => console.log(dataURL));\n\t */\n\ttoDataURL(type = \"image/png\", quality) {\n\t\treturn this.renderTarget.toDataURL(type, quality);\n\t}\n}\n", "/**\n * A simple multimap that stores multiple values per key using arrays.\n * @ignore\n */\nclass ArrayMultimap {\n\tconstructor() {\n\t\tthis._map = new Map();\n\t}\n\tput(key, value) {\n\t\tconst arr = this._map.get(key);\n\t\tif (arr) {\n\t\t\tarr.push(value);\n\t\t} else {\n\t\t\tthis._map.set(key, [value]);\n\t\t}\n\t}\n\tget(key) {\n\t\treturn this._map.get(key) || [];\n\t}\n\thas(key) {\n\t\treturn this._map.has(key);\n\t}\n\tdelete(key) {\n\t\tthis._map.delete(key);\n\t}\n\tforEach(callback) {\n\t\tthis._map.forEach((values, key) => {\n\t\t\tfor (const value of values) {\n\t\t\t\tcallback(value, key);\n\t\t\t}\n\t\t});\n\t}\n\tclear() {\n\t\tthis._map.clear();\n\t}\n}\n\nexport { ArrayMultimap };\n", "import { ETA } from \"../../../math/math.ts\";\nimport { Vector2d } from \"../../../math/vector2d.ts\";\n\n/**\n * parse the given data and return a corresponding atlas\n * @param {Object} data - atlas data information. See {@link loader.getJSON}\n * @param {TextureAtlas} textureAtlas - the texture atlas class calling the parser\n * @returns {Object} the corresponding Atlas\n * @ignore\n */\nexport function parseAseprite(data, textureAtlas) {\n\tconst atlas = {};\n\n\tconst frames = data.frames;\n\tfor (const name in frames) {\n\t\tconst frame = frames[name].frame;\n\t\tconst trimmed = !!frame.trimmed;\n\n\t\tlet trim;\n\n\t\tif (trimmed) {\n\t\t\ttrim = {\n\t\t\t\tx: frame.spriteSourceSize.x,\n\t\t\t\ty: frame.spriteSourceSize.y,\n\t\t\t\tw: frame.spriteSourceSize.w,\n\t\t\t\th: frame.spriteSourceSize.h,\n\t\t\t};\n\t\t}\n\n\t\tlet originX;\n\t\tlet originY;\n\t\t// Pixel-based offset origin from the top-left of the source frame\n\t\tconst hasTextureAnchorPoint = frame.sourceSize && frame.pivot;\n\t\tif (hasTextureAnchorPoint) {\n\t\t\toriginX = frame.sourceSize.w * frame.pivot.x - (trimmed ? trim.x : 0);\n\t\t\toriginY = frame.sourceSize.h * frame.pivot.y - (trimmed ? trim.y : 0);\n\t\t}\n\n\t\tatlas[name] = {\n\t\t\tname: name, // frame name\n\t\t\ttexture: data.meta.image || \"default\", // the source texture\n\t\t\toffset: new Vector2d(frame.x, frame.y),\n\t\t\tanchorPoint: hasTextureAnchorPoint\n\t\t\t\t? new Vector2d(originX / frame.w, originY / frame.h)\n\t\t\t\t: null,\n\t\t\ttrimmed: trimmed,\n\t\t\ttrim: trim,\n\t\t\twidth: frame.w,\n\t\t\theight: frame.h,\n\t\t\tangle: frame.rotated === true ? -ETA : 0,\n\t\t};\n\t\ttextureAtlas.addUVs(atlas, name, data.meta.size.w, data.meta.size.h);\n\t}\n\n\tconst anims = {};\n\tfor (const name in data.meta.frameTags) {\n\t\tconst anim = data.meta.frameTags[name];\n\t\t// aseprite provide a range from [from] to [to], so build the corresponding index array\n\t\tconst indexArray = Array.from(\n\t\t\t{ length: anim.to - anim.from + 1 },\n\t\t\t(_, i) => {\n\t\t\t\treturn anim.from + i;\n\t\t\t},\n\t\t);\n\t\tanims[name] = {\n\t\t\tname: anim.name,\n\t\t\tindex: indexArray,\n\t\t\t// aseprite provide animation speed between frame, melonJS expect total duration for a given animation\n\t\t\tspeed: 10 * (indexArray.length - 1),\n\t\t\t// only \"forward\" is supported for now\n\t\t\tdirection: anim.direction,\n\t\t};\n\t}\n\tatlas.anims = anims;\n\n\treturn atlas;\n}\n", "import { Vector2d, vector2dPool } from \"../../../math/vector2d.ts\";\n\n/**\n * parse the given data and return a corresponding atlas\n * @param {Object} data - atlas data information. See {@link loader.getJSON}\n * @param {TextureAtlas} textureAtlas - the texture atlas class calling the parser\n * @returns {Object} the corresponding Atlas\n * @ignore\n */\nexport function parseSpriteSheet(data, textureAtlas) {\n\tconst atlas = {};\n\tconst image = data.image;\n\tconst spacing = data.spacing || 0;\n\tconst margin = data.margin || 0;\n\n\tlet width = image.width;\n\tlet height = image.height;\n\n\t// calculate the sprite count (line, col)\n\tconst spritecount = vector2dPool.get(\n\t\t~~((width - margin + spacing) / (data.framewidth + spacing)),\n\t\t~~((height - margin + spacing) / (data.frameheight + spacing)),\n\t);\n\n\t// verifying the texture size\n\tif (\n\t\twidth % (data.framewidth + spacing) !== 0 ||\n\t\theight % (data.frameheight + spacing) !== 0\n\t) {\n\t\tconst computed_width = spritecount.x * (data.framewidth + spacing);\n\t\tconst computed_height = spritecount.y * (data.frameheight + spacing);\n\t\tif (\n\t\t\tcomputed_width - width !== spacing &&\n\t\t\tcomputed_height - height !== spacing\n\t\t) {\n\t\t\t// \"truncate size\" if delta is different from the spacing size\n\t\t\twidth = computed_width;\n\t\t\theight = computed_height;\n\t\t\t// warning message\n\t\t\tconsole.warn(\n\t\t\t\t\"Spritesheet Texture for image: \" +\n\t\t\t\t\timage.src +\n\t\t\t\t\t\" is not divisible by \" +\n\t\t\t\t\t(data.framewidth + spacing) +\n\t\t\t\t\t\"x\" +\n\t\t\t\t\t(data.frameheight + spacing) +\n\t\t\t\t\t\", truncating effective size to \" +\n\t\t\t\t\twidth +\n\t\t\t\t\t\"x\" +\n\t\t\t\t\theight,\n\t\t\t);\n\t\t}\n\t}\n\n\t// build the local atlas\n\tfor (\n\t\tlet frame = 0, count = spritecount.x * spritecount.y;\n\t\tframe < count;\n\t\tframe++\n\t) {\n\t\tconst name = \"\" + frame;\n\t\tatlas[name] = {\n\t\t\tname: name,\n\t\t\ttexture: \"default\", // the source texture\n\t\t\toffset: new Vector2d(\n\t\t\t\tmargin + (spacing + data.framewidth) * (frame % spritecount.x),\n\t\t\t\tmargin + (spacing + data.frameheight) * ~~(frame / spritecount.x),\n\t\t\t),\n\t\t\tanchorPoint: data.anchorPoint || null,\n\t\t\ttrimmed: false,\n\t\t\ttrim: undefined,\n\t\t\twidth: data.framewidth,\n\t\t\theight: data.frameheight,\n\t\t\tangle: 0,\n\t\t};\n\t\ttextureAtlas.addUVs(atlas, name, width, height);\n\t}\n\n\tvector2dPool.release(spritecount);\n\n\treturn atlas;\n}\n", "import { ETA } from \"./../../../math/math.ts\";\nimport { Vector2d } from \"../../../math/vector2d.ts\";\n\n/**\n * parse the given data and return a corresponding atlas\n * @param {Object} data - atlas data information. See {@link loader.getJSON}\n * @param {TextureAtlas} textureAtlas - the texture atlas class calling the parser\n * @returns {Object} the corresponding Atlas\n * @ignore\n */\nexport function parseTexturePacker(data, textureAtlas) {\n\tconst atlas = {};\n\n\tdata.frames.forEach((frame) => {\n\t\t// fix wrongly formatted JSON (e.g. last dummy object in ShoeBox)\n\t\tif (frame.hasOwnProperty(\"filename\")) {\n\t\t\t// Source coordinates\n\t\t\tconst s = frame.frame;\n\t\t\tconst trimmed = !!frame.trimmed;\n\n\t\t\tlet trim;\n\n\t\t\tif (trimmed) {\n\t\t\t\ttrim = {\n\t\t\t\t\tx: frame.spriteSourceSize.x,\n\t\t\t\t\ty: frame.spriteSourceSize.y,\n\t\t\t\t\tw: frame.spriteSourceSize.w,\n\t\t\t\t\th: frame.spriteSourceSize.h,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet originX;\n\t\t\tlet originY;\n\t\t\t// Pixel-based offset origin from the top-left of the source frame\n\t\t\tconst hasTextureAnchorPoint = frame.sourceSize && frame.pivot;\n\t\t\tif (hasTextureAnchorPoint) {\n\t\t\t\toriginX = frame.sourceSize.w * frame.pivot.x - (trimmed ? trim.x : 0);\n\t\t\t\toriginY = frame.sourceSize.h * frame.pivot.y - (trimmed ? trim.y : 0);\n\t\t\t}\n\n\t\t\tatlas[frame.filename] = {\n\t\t\t\tname: frame.filename, // frame name\n\t\t\t\ttexture: data.meta.image || \"default\", // the source texture\n\t\t\t\toffset: new Vector2d(s.x, s.y),\n\t\t\t\tanchorPoint: hasTextureAnchorPoint\n\t\t\t\t\t? new Vector2d(originX / s.w, originY / s.h)\n\t\t\t\t\t: null,\n\t\t\t\ttrimmed: trimmed,\n\t\t\t\ttrim: trim,\n\t\t\t\twidth: s.w,\n\t\t\t\theight: s.h,\n\t\t\t\tangle: frame.rotated === true ? -ETA : 0,\n\t\t\t};\n\t\t\ttextureAtlas.addUVs(\n\t\t\t\tatlas,\n\t\t\t\tframe.filename,\n\t\t\t\tdata.meta.size.w,\n\t\t\t\tdata.meta.size.h,\n\t\t\t);\n\t\t}\n\t});\n\treturn atlas;\n}\n", "import { getImage } from \"./../../loader/loader.js\";\nimport { Vector2d } from \"../../math/vector2d.ts\";\nimport Sprite from \"./../../renderable/sprite.js\";\nimport pool from \"../../system/legacy_pool.js\";\nimport { renderer } from \"./../video.js\";\nimport { parseAseprite } from \"./parser/aseprite.js\";\nimport { parseSpriteSheet } from \"./parser/spritesheet.js\";\nimport { parseTexturePacker } from \"./parser/texturepacker.js\";\n\n/**\n * additional import for TypeScript\n * @import NineSliceSprite from \"./../../renderable/nineslicesprite.js\";\n */\n\n/**\n * create a simple 1 frame texture atlas based on the given parameters\n * @ignore\n */\nexport function createAtlas(\n\twidth,\n\theight,\n\tname = \"default\",\n\trepeat = \"no-repeat\",\n) {\n\treturn {\n\t\tmeta: {\n\t\t\tapp: \"melonJS\",\n\t\t\tsize: { w: width, h: height },\n\t\t\trepeat: repeat,\n\t\t\timage: \"default\",\n\t\t},\n\t\tframes: [\n\t\t\t{\n\t\t\t\tfilename: name,\n\t\t\t\tframe: { x: 0, y: 0, w: width, h: height },\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * return a string that identifies the texture atlas type\n * @ignore\n */\nexport function identifyFormat(app) {\n\tif (app.includes(\"texturepacker\") || app.includes(\"free-tex-packer\")) {\n\t\treturn \"texturepacker\";\n\t} else if (app.includes(\"shoebox\")) {\n\t\treturn \"shoebox\";\n\t} else if (app.includes(\"aseprite\")) {\n\t\treturn \"aseprite\";\n\t} else if (app.includes(\"melonJS\")) {\n\t\treturn \"melonJS\";\n\t} else {\n\t\tthrow new Error(\"Unknown texture atlas format: \" + app);\n\t}\n}\n\n/**\n * A Texture atlas class, currently supports : <br>\n * - [TexturePacker]{@link http://www.codeandweb.com/texturepacker/} : through JSON export (standard and multipack texture atlas) <br>\n * - [Free Texture Packer]{@link http://free-tex-packer.com/app/} : through JSON export (standard and multipack texture atlas) <br>\n * - [aseprite]{@link https://www.aseprite.org/} : through JSON export (standard and multipack texture atlas) <br>\n * - [ShoeBox]{@link http://renderhjs.net/shoebox/} : through JSON export using the\n * melonJS setting [file]{@link https://github.com/melonjs/melonJS/raw/master/media/shoebox_JSON_export.sbx} <br>\n * - Standard (fixed cell size) spritesheet : through a {framewidth:xx, frameheight:xx, anchorPoint:me.Vector2d} object\n * );\n */\nexport class TextureAtlas {\n\t/**\n\t * @param {object|object[]} atlases - atlas information. See {@link loader.getJSON}\n\t * @param {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|string|OffscreenCanvas[]|HTMLImageElement[]|HTMLCanvasElement[]|string[]} [src=atlas.meta.image] - Image source\n\t * @param {boolean} [cache=false] - Use true to skip caching this Texture\n\t * @example\n\t * // create a texture atlas from a JSON Object\n\t * game.texture = new me.TextureAtlas(\n\t * me.loader.getJSON(\"texture\")\n\t * );\n\t *\n\t * // create a texture atlas from a multipack JSON Object\n\t * game.texture = new me.TextureAtlas([\n\t * me.loader.getJSON(\"texture-0\"),\n\t * me.loader.getJSON(\"texture-1\"),\n\t * me.loader.getJSON(\"texture-2\")\n\t * ]);\n\t *\n\t * // create a texture atlas for a spritesheet with an anchorPoint in the center of each frame\n\t * game.texture = new me.TextureAtlas(\n\t * {\n\t * framewidth : 32,\n\t * frameheight : 32,\n\t * anchorPoint : new me.Vector2d(0.5, 0.5)\n\t * },\n\t * me.loader.getImage(\"spritesheet\")\n\t */\n\tconstructor(atlases, src, cache) {\n\t\t/**\n\t\t * to identify the atlas format (e.g. texture packer)\n\t\t * @ignore\n\t\t */\n\t\tthis.format = null;\n\n\t\t/**\n\t\t * the texture source(s) itself\n\t\t * @type {Map}\n\t\t * @ignore\n\t\t */\n\t\tthis.sources = new Map();\n\n\t\t/**\n\t\t * the atlas dictionnaries\n\t\t * @type {Map}\n\t\t * @ignore\n\t\t */\n\t\tthis.atlases = new Map();\n\n\t\t/**\n\t\t * the default \"active\" atlas (used for multiAtlas)\n\t\t * @type {Map}\n\t\t * @ignore\n\t\t */\n\t\tthis.activeAtlas = undefined;\n\n\t\t// parse given atlas(es) paremeters\n\t\tif (typeof atlases !== \"undefined\") {\n\t\t\t// normalize to array to keep the following code generic\n\t\t\tatlases = Array.isArray(atlases) ? atlases : [atlases];\n\t\t\tfor (const i in atlases) {\n\t\t\t\tconst atlas = atlases[i];\n\n\t\t\t\tif (typeof atlas.meta !== \"undefined\") {\n\t\t\t\t\tthis.format = identifyFormat(atlas.meta.app);\n\t\t\t\t\tthis.repeat = atlas.meta.repeat || \"no-repeat\";\n\t\t\t\t\tswitch (this.format) {\n\t\t\t\t\t\tcase \"texturepacker\":\n\t\t\t\t\t\tcase \"aseprite\":\n\t\t\t\t\t\t\t// set the texture\n\t\t\t\t\t\t\tif (typeof src === \"undefined\") {\n\t\t\t\t\t\t\t\t// get the texture name from the atlas meta data\n\t\t\t\t\t\t\t\tconst image = getImage(atlas.meta.image);\n\t\t\t\t\t\t\t\tif (!image) {\n\t\t\t\t\t\t\t\t\tthrow new Error(\"Atlas texture '\" + image + \"' not found\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.sources.set(atlas.meta.image, image);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.sources.set(\n\t\t\t\t\t\t\t\t\tatlas.meta.image || \"default\",\n\t\t\t\t\t\t\t\t\ttypeof src === \"string\" ? getImage(src) : src,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// initialize the atlas\n\t\t\t\t\t\t\tif (this.format === \"texturepacker\") {\n\t\t\t\t\t\t\t\tthis.atlases.set(\n\t\t\t\t\t\t\t\t\tatlas.meta.image || \"default\",\n\t\t\t\t\t\t\t\t\tparseTexturePacker(atlas, this),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.atlases.set(\n\t\t\t\t\t\t\t\t\tatlas.meta.image || \"default\",\n\t\t\t\t\t\t\t\t\tparseAseprite(atlas, this),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"shoebox\":\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!atlas.meta.exporter ||\n\t\t\t\t\t\t\t\t!atlas.meta.exporter.includes(\"melonJS\")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\"ShoeBox requires the JSON exporter : \" +\n\t\t\t\t\t\t\t\t\t\t\"https://github.com/melonjs/melonJS/tree/master/media/shoebox_JSON_export.sbx\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.sources.set(\n\t\t\t\t\t\t\t\t\"default\",\n\t\t\t\t\t\t\t\ttypeof src === \"string\" ? getImage(src) : src,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// initialize the atlas\n\t\t\t\t\t\t\tthis.atlases.set(\n\t\t\t\t\t\t\t\tatlas.meta.image || \"default\",\n\t\t\t\t\t\t\t\tparseTexturePacker(atlas, this),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"melonJS\":\n\t\t\t\t\t\t\tthis.sources.set(\n\t\t\t\t\t\t\t\t\"default\",\n\t\t\t\t\t\t\t\ttypeof src === \"string\" ? getImage(src) : src,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// initialize the atlas\n\t\t\t\t\t\t\tthis.atlases.set(\n\t\t\t\t\t\t\t\tatlas.meta.image || \"default\",\n\t\t\t\t\t\t\t\tparseTexturePacker(atlas, this),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"Unknown texture atlas format: \" + atlas.meta.app,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// a regular spritesheet\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof atlas.framewidth !== \"undefined\" &&\n\t\t\t\t\t\ttypeof atlas.frameheight !== \"undefined\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.format = \"Spritesheet (fixed cell size)\";\n\t\t\t\t\t\tthis.repeat = \"no-repeat\";\n\n\t\t\t\t\t\tif (typeof src !== \"undefined\") {\n\t\t\t\t\t\t\t// overwrite if specified\n\t\t\t\t\t\t\tatlas.image = typeof src === \"string\" ? getImage(src) : src;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// initialize the atlas\n\t\t\t\t\t\tthis.atlases.set(\"default\", parseSpriteSheet(atlas, this));\n\t\t\t\t\t\tthis.sources.set(\"default\", atlas.image);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} // end forEach\n\t\t\tthis.activeAtlas = this.atlases.keys().next().value;\n\t\t}\n\n\t\t// if format not recognized\n\t\tif (this.atlases.length === 0) {\n\t\t\tthrow new Error(\"texture atlas format not supported\");\n\t\t}\n\n\t\t// Add self to TextureCache if cache !== false\n\t\tif (cache !== false) {\n\t\t\tthis.sources.forEach((source) => {\n\t\t\t\trenderer.cache.set(source, this);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * return the default or specified atlas dictionnary\n\t * @param {string} [name] - atlas name in case of multipack textures\n\t * @returns {object}\n\t */\n\tgetAtlas(name) {\n\t\tif (typeof name === \"string\") {\n\t\t\treturn this.atlases.get(name);\n\t\t} else {\n\t\t\treturn this.atlases.get(this.activeAtlas);\n\t\t}\n\t}\n\n\t/**\n\t * return the format of the atlas dictionnary\n\t * @returns {string} will return \"texturepacker\", or \"ShoeBox\", or \"melonJS\", or \"Spritesheet (fixed cell size)\"\n\t */\n\tgetFormat() {\n\t\treturn this.format;\n\t}\n\n\t/**\n\t * return the source texture for the given region (or default one if none specified)\n\t * @param {object} [region] - region name in case of multipack textures\n\t * @returns {HTMLImageElement|HTMLCanvasElement}\n\t */\n\tgetTexture(region) {\n\t\tif (typeof region === \"object\" && typeof region.texture === \"string\") {\n\t\t\treturn this.sources.get(region.texture);\n\t\t} else {\n\t\t\treturn this.sources.get(this.activeAtlas);\n\t\t}\n\t}\n\n\t/**\n\t * add a region to the atlas\n\t * @param {string} name - region mame\n\t * @param {number} x - x origin of the region\n\t * @param {number} y - y origin of the region\n\t * @param {number} w - width of the region\n\t * @param {number} h - height of the region\n\t * @returns {object} the created region\n\t */\n\taddRegion(name, x, y, w, h) {\n\t\t// TODO: Require proper atlas regions instead of caching arbitrary region keys\n\t\tif (renderer.settings.verbose === true) {\n\t\t\tconsole.warn(\"Adding texture region\", name, \"for texture\", this);\n\t\t}\n\n\t\tconst source = this.getTexture();\n\t\tconst atlas = this.getAtlas();\n\t\tconst dw = source.width;\n\t\tconst dh = source.height;\n\n\t\tatlas[name] = {\n\t\t\tname: name,\n\t\t\toffset: new Vector2d(x, y),\n\t\t\twidth: w,\n\t\t\theight: h,\n\t\t\tangle: 0,\n\t\t};\n\n\t\tthis.addUVs(atlas, name, dw, dh);\n\n\t\treturn atlas[name];\n\t}\n\n\t/**\n\t * return a normalized region (or frame) information for the specified sprite name\n\t * @param {string} name - name of the sprite\n\t * @param {string} [atlas] - name of a specific atlas where to search for the region\n\t * @returns {object}\n\t */\n\tgetRegion(name, atlas) {\n\t\tlet region;\n\t\tif (typeof atlas === \"string\") {\n\t\t\tregion = this.getAtlas(atlas)[name];\n\t\t} else {\n\t\t\t// look for the given region in each existing atlas\n\t\t\tfor (const atlas of this.atlases.values()) {\n\t\t\t\tif (typeof atlas[name] !== \"undefined\") {\n\t\t\t\t\t// there should be only one\n\t\t\t\t\tregion = atlas[name];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn region;\n\t}\n\n\t/**\n\t * return the uvs mapping for the given region\n\t * @param {object} name - region (or frame) name\n\t * @returns {Float32Array} region Uvs\n\t */\n\tgetUVs(name) {\n\t\t// Get the source texture region\n\t\tlet region = this.getRegion(name);\n\n\t\tif (typeof region === \"undefined\") {\n\t\t\t// TODO: Require proper atlas regions instead of caching arbitrary region keys\n\t\t\tconst keys = name.split(\",\");\n\t\t\tconst sx = +keys[0];\n\t\t\tconst sy = +keys[1];\n\t\t\tconst sw = +keys[2];\n\t\t\tconst sh = +keys[3];\n\t\t\tregion = this.addRegion(name, sx, sy, sw, sh);\n\t\t}\n\t\treturn region.uvs;\n\t}\n\n\t/**\n\t * add uvs mapping for the given region\n\t * @param {object} atlas - the atlas dictionnary where the region is define\n\t * @param {object} name - region (or frame) name\n\t * @param {number} w - the width of the region\n\t * @param {number} h - the height of the region\n\t * @returns {Float32Array} the created region UVs\n\t */\n\taddUVs(atlas, name, w, h) {\n\t\t// ignore if using the Canvas Renderer\n\t\tif (typeof renderer.gl !== \"undefined\") {\n\t\t\t// Source coordinates\n\t\t\tconst s = atlas[name].offset;\n\t\t\tconst sw = atlas[name].width;\n\t\t\tconst sh = atlas[name].height;\n\n\t\t\tatlas[name].uvs = new Float32Array([\n\t\t\t\ts.x / w, // u0 (left)\n\t\t\t\ts.y / h, // v0 (top)\n\t\t\t\t(s.x + sw) / w, // u1 (right)\n\t\t\t\t(s.y + sh) / h, // v1 (bottom)\n\t\t\t]);\n\t\t\t// Cache source coordinates\n\t\t\t// TODO: Remove this when the Batcher only accepts a region name\n\t\t\tconst key = s.x + \",\" + s.y + \",\" + w + \",\" + h;\n\t\t\tatlas[key] = atlas[name];\n\t\t}\n\t\treturn atlas[name].uvs;\n\t}\n\n\t/**\n\t * Create a sprite object using the first region found using the specified name\n\t * @param {string} name - name of the sprite\n\t * @param {object} [settings] - Additional settings passed to the {@link Sprite} contructor\n\t * @param {boolean} [nineSlice=false] - if true returns a 9-slice sprite\n\t * @returns {Sprite|NineSliceSprite}\n\t * @example\n\t * // create a new texture object under the `game` namespace\n\t * game.texture = new me.TextureAtlas(\n\t * me.loader.getJSON(\"texture\"),\n\t * me.loader.getImage(\"texture\")\n\t * );\n\t * ...\n\t * ...\n\t * // create a new \"coin\" sprite\n\t * let sprite = game.texture.createSpriteFromName(\"coin.png\");\n\t * // set the renderable position to bottom center\n\t * sprite.anchorPoint.set(0.5, 1.0);\n\t * ...\n\t * ...\n\t * // create a 9-slice sprite\n\t * let dialogPanel = game.texture.createSpriteFromName(\n\t * \"rpg_dialo.png\",\n\t * // width & height are mandatory for 9-slice sprites\n\t * { width: this.width, height: this.height },\n\t * true\n\t * );\n\t */\n\tcreateSpriteFromName(name, settings, nineSlice = false) {\n\t\t// instantiate a new sprite object\n\t\treturn pool.pull(\n\t\t\tnineSlice === true ? \"me.NineSliceSprite\" : \"me.Sprite\",\n\t\t\t0,\n\t\t\t0,\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\timage: this,\n\t\t\t\t\tregion: name,\n\t\t\t\t},\n\t\t\t\tsettings || {},\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Create an animation object using the first region found using all specified names\n\t * @param {string[]|number[]} [names] - list of names for each sprite (if not specified all defined names/entries in the atlas will be added)\n\t * (when manually creating a Texture out of a spritesheet, only numeric values are authorized)\n\t * @param {object} [settings] - Additional settings passed to the {@link Sprite} contructor\n\t * @returns {Sprite}\n\t * @example\n\t * // create a new texture object under the `game` namespace\n\t * game.texture = new me.TextureAtlas(\n\t * me.loader.getJSON(\"texture\"),\n\t * me.loader.getImage(\"texture\")\n\t * );\n\t *\n\t * // create a new Animated Sprite\n\t * let sprite = game.texture.createAnimationFromName([\n\t * \"walk0001.png\", \"walk0002.png\", \"walk0003.png\",\n\t * \"walk0004.png\", \"walk0005.png\", \"walk0006.png\",\n\t * \"walk0007.png\", \"walk0008.png\", \"walk0009.png\",\n\t * \"walk0010.png\", \"walk0011.png\"\n\t * ]);\n\t *\n\t * // define an additional basic walking animation\n\t * sprite.addAnimation (\"simple_walk\", [0,2,1]);\n\t * // you can also use frame name to define your animation\n\t * sprite.addAnimation (\"speed_walk\", [\"walk0007.png\", \"walk0008.png\", \"walk0009.png\", \"walk0010.png\"]);\n\t * // set the default animation\n\t * sprite.setCurrentAnimation(\"simple_walk\");\n\t * // set the renderable position to bottom center\n\t * sprite.anchorPoint.set(0.5, 1.0);\n\t */\n\tcreateAnimationFromName(names, settings) {\n\t\tconst tpAtlas = [];\n\t\tconst indices = {};\n\t\tlet width = 0;\n\t\tlet height = 0;\n\t\tconst textureAtlas = this.getAtlas();\n\t\t// iterate through the given names\n\t\t// and create a \"normalized\" atlas\n\n\t\tif (typeof names === \"undefined\") {\n\t\t\tnames = textureAtlas;\n\t\t}\n\n\t\tfor (const i in names) {\n\t\t\tconst name = Array.isArray(names) ? names[i] : i;\n\t\t\tconst region = this.getRegion(name);\n\t\t\tif (region == null) {\n\t\t\t\t// throw an error\n\t\t\t\tthrow new Error(\"Texture - region for \" + name + \" not found\");\n\t\t\t}\n\t\t\ttpAtlas.push(region);\n\t\t\t// save the corresponding index\n\t\t\tindices[name] = tpAtlas.length - 1;\n\t\t\t// calculate the max size of a frame\n\t\t\twidth = Math.max(region.width, width);\n\t\t\theight = Math.max(region.height, height);\n\t\t}\n\n\t\t// instantiate a new animation sheet object\n\t\treturn new Sprite(\n\t\t\t0,\n\t\t\t0,\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\timage: this,\n\t\t\t\t\tframewidth: width,\n\t\t\t\t\tframeheight: height,\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tspacing: 0,\n\t\t\t\t\tatlas: tpAtlas,\n\t\t\t\t\tanims: textureAtlas.anims,\n\t\t\t\t\tatlasIndices: indices,\n\t\t\t\t},\n\t\t\t\tsettings || {},\n\t\t\t),\n\t\t);\n\t}\n}\n", "import { isPowerOfTwo } from \"./../../math/math.ts\";\nimport { ArrayMultimap } from \"../../utils/array-multimap.js\";\nimport { getBasename } from \"../../utils/file.ts\";\nimport { renderer } from \"./../video.js\";\nimport { createAtlas, TextureAtlas } from \"./atlas.js\";\n\n/**\n * a basic texture cache object\n * @ignore\n */\nclass TextureCache {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(max_size = Infinity) {\n\t\t// cache uses an array to allow for duplicated key\n\t\tthis.cache = new ArrayMultimap();\n\t\tthis.tinted = new Map();\n\t\tthis.units = new Map();\n\t\tthis.usedUnits = new Set();\n\t\tthis.max_size = max_size;\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.tinted.clear();\n\t\tthis.units.clear();\n\t\tthis.usedUnits.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tallocateTextureUnit() {\n\t\t// find the first unit available among the max_size\n\t\tfor (let unit = 0; unit < this.max_size; unit++) {\n\t\t\t// Check if unit is available\n\t\t\tif (!this.usedUnits.has(unit)) {\n\t\t\t\t// Add to used set\n\t\t\t\tthis.usedUnits.add(unit);\n\t\t\t\t// return the new unit\n\t\t\t\treturn unit;\n\t\t\t}\n\t\t}\n\n\t\t// No units available\n\t\t// TODO: Merge textures instead of throwing an exception\n\t\tthrow new Error(\n\t\t\t\"Texture cache overflow: \" +\n\t\t\t\tthis.max_size +\n\t\t\t\t\" texture units available for this GPU.\",\n\t\t);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tfreeTextureUnit(texture) {\n\t\tconst source = texture.sources.get(texture.activeAtlas);\n\t\tconst unit = this.units.get(source);\n\t\t// was a texture unit allocated ?\n\t\tif (typeof unit !== \"undefined\") {\n\t\t\tthis.usedUnits.delete(source);\n\t\t\tthis.units.delete(source);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tgetUnit(texture) {\n\t\tconst source = texture.sources.get(texture.activeAtlas);\n\t\tif (!this.units.has(source)) {\n\t\t\tthis.units.set(source, this.allocateTextureUnit());\n\t\t}\n\t\treturn this.units.get(source);\n\t}\n\n\t/**\n\t * @ignore\n\t * cache the textureAltas for the given image\n\t */\n\tset(image, textureAtlas) {\n\t\tconst width = image.width || image.videoWidth;\n\t\tconst height = image.height || image.videoHeight;\n\n\t\t// warn if a non POT texture is added to the cache when using WebGL1\n\t\tif (\n\t\t\trenderer.WebGLVersion === 1 &&\n\t\t\t(!isPowerOfTwo(width) || !isPowerOfTwo(height))\n\t\t) {\n\t\t\tconst src = typeof image.src !== \"undefined\" ? image.src : image;\n\t\t\tconsole.warn(\n\t\t\t\t\"[Texture] \" +\n\t\t\t\t\tsrc +\n\t\t\t\t\t\" is not a POT texture \" +\n\t\t\t\t\t\"(\" +\n\t\t\t\t\twidth +\n\t\t\t\t\t\"x\" +\n\t\t\t\t\theight +\n\t\t\t\t\t\")\",\n\t\t\t);\n\t\t}\n\t\treturn this.cache.put(image, textureAtlas);\n\t}\n\n\t/**\n\t * @ignore\n\t * return the textureAltas for the given image\n\t */\n\tget(image, atlas) {\n\t\tlet entry = this.cache.get(image)[0];\n\n\t\tif (typeof entry !== \"undefined\" && typeof atlas !== \"undefined\") {\n\t\t\tthis.cache.forEach((value, key) => {\n\t\t\t\tconst _atlas = value.getAtlas();\n\t\t\t\tif (\n\t\t\t\t\tkey === image &&\n\t\t\t\t\t_atlas.width === atlas.framewidth &&\n\t\t\t\t\t_atlas.height === atlas.frameheight\n\t\t\t\t) {\n\t\t\t\t\tentry = value;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (typeof entry === \"undefined\") {\n\t\t\tif (!atlas) {\n\t\t\t\tatlas = createAtlas(\n\t\t\t\t\timage.width || image.videoWidth,\n\t\t\t\t\timage.height || image.videoHeight,\n\t\t\t\t\timage.src ? getBasename(image.src) : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tentry = new TextureAtlas(atlas, image, false);\n\t\t\tthis.set(image, entry);\n\t\t}\n\n\t\t// \"activate\" the corresponding sources (in case of multi texture atlas)\n\t\tif (typeof entry.sources !== \"undefined\" && entry.sources.size > 1) {\n\t\t\t// manage cases where a specific atlas is specified\n\t\t\tfor (const [key, value] of entry.sources.entries()) {\n\t\t\t\t// Check if the imageData matches the provided image\n\t\t\t\tif (value === image) {\n\t\t\t\t\tentry.activeAtlas = key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn entry;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tdelete(image) {\n\t\tif (this.cache.has(image)) {\n\t\t\tconst texture = this.cache.get(image)[0];\n\t\t\tif (typeof texture !== \"undefined\") {\n\t\t\t\tthis.freeTextureUnit(texture);\n\t\t\t}\n\t\t\tthis.cache.delete(image);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttint(src, color) {\n\t\t// make sure the src is in the cache\n\t\tlet image_cache = this.tinted.get(src);\n\n\t\tif (image_cache === undefined) {\n\t\t\timage_cache = this.tinted.set(src, new Map());\n\t\t}\n\n\t\tif (!image_cache.has(color)) {\n\t\t\timage_cache.set(color, renderer.tint(src, color, \"multiply\"));\n\t\t}\n\n\t\treturn image_cache.get(color);\n\t}\n}\nexport default TextureCache;\n", "import { Color } from \"./../../math/color.ts\";\nimport {\n\teventEmitter,\n\tGAME_RESET,\n\tONCONTEXT_LOST,\n\tONCONTEXT_RESTORED,\n} from \"../../system/event.ts\";\nimport Renderer from \"./../renderer.js\";\nimport TextureCache from \"./../texture/cache.js\";\n\n/**\n * additional import for TypeScript\n * @import {Rect} from \"./../../geometries/rectangle.ts\";\n * @import {RoundRect} from \"./../../geometries/roundrect.ts\";\n * @import {Polygon} from \"../../geometries/polygon.ts\";\n * @import {Line} from \"./../../geometries/line.ts\";\n * @import {Ellipse} from \"./../../geometries/ellipse.ts\";\n * @import {Matrix2d} from \"../../math/matrix2d.ts\";\n */\n\n/**\n * a canvas renderer object\n */\nexport default class CanvasRenderer extends Renderer {\n\t/**\n\t * @param {ApplicationSettings} [options] - optional parameters for the renderer\n\t */\n\tconstructor(options) {\n\t\t// parent constructor\n\t\tsuper(options);\n\n\t\tthis.setBlendMode(this.settings.blendMode);\n\n\t\t// apply the default color to the 2d context\n\t\tthis.setColor(this.currentColor);\n\n\t\t// create a texture cache\n\t\tthis.cache = new TextureCache();\n\n\t\tif (this.settings.textureSeamFix !== false && !this.settings.antiAlias) {\n\t\t\t// enable the tile texture seam fix with the canvas renderer\n\t\t\tthis.uvOffset = 1;\n\t\t}\n\n\t\t// set the renderer type\n\t\tthis.type = \"CANVAS\";\n\n\t\t// context lost & restore event for canvas\n\t\tthis.getCanvas().addEventListener(\n\t\t\t\"contextlost\",\n\t\t\t(e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.isContextValid = false;\n\t\t\t\teventEmitter.emit(ONCONTEXT_LOST, this);\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t\t// ctx.restoreContext()\n\t\tthis.getCanvas().addEventListener(\n\t\t\t\"contextrestored\",\n\t\t\t() => {\n\t\t\t\tthis.isContextValid = true;\n\t\t\t\teventEmitter.emit(ONCONTEXT_RESTORED, this);\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\t// reset the renderer on game reset\n\t\teventEmitter.addListener(GAME_RESET, () => {\n\t\t\tthis.reset();\n\t\t});\n\t}\n\n\t/**\n\t * Reset context state\n\t */\n\treset() {\n\t\tsuper.reset();\n\t\tthis.clearColor(this.currentColor, this.settings.transparent !== true);\n\t}\n\n\t/**\n\t * Reset the canvas transform to identity\n\t */\n\tresetTransform() {\n\t\tthis.getContext().setTransform(1, 0, 0, 1, 0, 0);\n\t}\n\n\t/**\n\t * set a blend mode for the given context. <br>\n\t * Supported blend mode between Canvas and WebGL remderer : <br>\n\t * - \"normal\" : this is the default mode and draws new content on top of the existing content <br>\n\t * <img src=\"../images/normal-blendmode.png\" width=\"510\"/> <br>\n\t * - \"multiply\" : the pixels of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result. <br>\n\t * <img src=\"../images/multiply-blendmode.png\" width=\"510\"/> <br>\n\t * - \"additive or lighter\" : where both content overlap the color is determined by adding color values. <br>\n\t * <img src=\"../images/lighter-blendmode.png\" width=\"510\"/> <br>\n\t * - \"screen\" : The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply) <br>\n\t * <img src=\"../images/screen-blendmode.png\" width=\"510\"/> <br>\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n\t * @param {string} [mode=\"normal\"] - blend mode : \"normal\", \"multiply\", \"lighter, \"additive\", \"screen\"\n\t * @param {CanvasRenderingContext2D} [context]\n\t */\n\tsetBlendMode(mode = \"normal\", context) {\n\t\tcontext = context || this.getContext();\n\t\tthis.currentBlendMode = mode;\n\t\tswitch (mode) {\n\t\t\tcase \"screen\":\n\t\t\t\tcontext.globalCompositeOperation = \"screen\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"lighter\":\n\t\t\tcase \"additive\":\n\t\t\t\tcontext.globalCompositeOperation = \"lighter\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"multiply\":\n\t\t\t\tcontext.globalCompositeOperation = \"multiply\";\n\t\t\t\tbreak;\n\n\t\t\tdefault: // normal\n\t\t\t\tcontext.globalCompositeOperation = \"source-over\";\n\t\t\t\tthis.currentBlendMode = \"normal\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * prepare the framebuffer for drawing a new frame\n\t */\n\tclear() {\n\t\tif (this.backgroundColor.alpha > 0) {\n\t\t\tthis.clearColor(this.backgroundColor);\n\t\t}\n\t}\n\n\t/**\n\t * Clears the main framebuffer with the given color\n\t * @param {Color|string} [color=\"#000000\"] - CSS color.\n\t * @param {boolean} [opaque=false] - Allow transparency [default] or clear the surface completely [true]\n\t */\n\tclearColor(color = \"#000000\", opaque = false) {\n\t\tconst canvas = this.getCanvas();\n\t\tconst context = this.getContext();\n\n\t\tthis.save();\n\t\tthis.resetTransform();\n\t\tcontext.globalAlpha = 1;\n\t\tcontext.globalCompositeOperation = opaque === true ? \"copy\" : \"source-over\";\n\t\tcontext.fillStyle = color instanceof Color ? color.toRGBA() : color;\n\t\tthis.fillRect(0, 0, canvas.width, canvas.height);\n\t\tthis.restore();\n\t}\n\n\t/**\n\t * Erase the pixels in the given rectangular area by setting them to transparent black (rgba(0,0,0,0)).\n\t * @param {number} x - x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t */\n\tclearRect(x, y, width, height) {\n\t\tthis.getContext().clearRect(x, y, width, height);\n\t}\n\n\t/**\n\t * Create a pattern with the specified repetition\n\t * @param {HTMLImageElement|SVGImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap|OffscreenCanvas|VideoFrame} image - Source image to be used as the pattern's image\n\t * @param {string} repeat - Define how the pattern should be repeated\n\t * @returns {CanvasPattern}\n\t * @see ImageLayer#repeat\n\t * @example\n\t * let tileable = renderer.createPattern(image, \"repeat\");\n\t * let horizontal = renderer.createPattern(image, \"repeat-x\");\n\t * let vertical = renderer.createPattern(image, \"repeat-y\");\n\t * let basic = renderer.createPattern(image, \"no-repeat\");\n\t */\n\tcreatePattern(image, repeat) {\n\t\treturn this.getContext().createPattern(image, repeat);\n\t}\n\n\t/**\n\t * Draw an image onto the main using the canvas api\n\t * @param {HTMLImageElement|SVGImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap|OffscreenCanvas|VideoFrame} image - An element to draw into the context.\n\t * @param {number} sx - The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} sy - The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} sw - The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by sx and sy to the bottom-right corner of the image is used.\n\t * @param {number} sh - The height of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} dx - The X coordinate in the destination canvas at which to place the top-left corner of the source image.\n\t * @param {number} dy - The Y coordinate in the destination canvas at which to place the top-left corner of the source image.\n\t * @param {number} dw - The width to draw the image in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.\n\t * @param {number} dh - The height to draw the image in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.\n\t * @example\n\t * // Position the image on the canvas:\n\t * renderer.drawImage(image, dx, dy);\n\t * // Position the image on the canvas, and specify width and height of the image:\n\t * renderer.drawImage(image, dx, dy, dWidth, dHeight);\n\t * // Clip the image and position the clipped part on the canvas:\n\t * renderer.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n\t */\n\tdrawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\n\t\tif (typeof sw === \"undefined\") {\n\t\t\tsw = dw = image.width;\n\t\t\tsh = dh = image.height;\n\t\t\tdx = sx;\n\t\t\tdy = sy;\n\t\t\tsx = 0;\n\t\t\tsy = 0;\n\t\t} else if (typeof dx === \"undefined\") {\n\t\t\tdx = sx;\n\t\t\tdy = sy;\n\t\t\tdw = sw;\n\t\t\tdh = sh;\n\t\t\tsw = image.width;\n\t\t\tsh = image.height;\n\t\t\tsx = 0;\n\t\t\tsy = 0;\n\t\t}\n\n\t\tif (this.settings.subPixel === false) {\n\t\t\t// clamp to pixel grid\n\t\t\tdx = ~~dx;\n\t\t\tdy = ~~dy;\n\t\t}\n\n\t\t// apply a tint if required\n\t\tlet source = image;\n\t\tconst tint = this.currentTint.toArray();\n\t\tif (tint[0] !== 1.0 || tint[1] !== 1.0 || tint[2] !== 1.0) {\n\t\t\t// get a tinted version of this image from the texture cache\n\t\t\tsource = this.cache.tint(image, this.currentTint.toRGB());\n\t\t}\n\t\tcontext.drawImage(source, sx, sy, sw, sh, dx, dy, dw, dh);\n\t}\n\n\t/**\n\t * Draw a pattern within the given rectangle.\n\t * @param {CanvasPattern} pattern - Pattern object\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @see CanvasRenderer#createPattern\n\t */\n\tdrawPattern(pattern, x, y, width, height) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\t\tconst fillStyle = context.fillStyle;\n\t\tcontext.fillStyle = pattern;\n\t\tcontext.fillRect(x, y, width, height);\n\t\tcontext.fillStyle = fillStyle;\n\t}\n\n\t/**\n\t * starts a new path by emptying the list of sub-paths. Call this method when you want to create a new path\n\t * @example\n\t * // First path\n\t * renderer.beginPath();\n\t * renderer.setColor(\"blue\");\n\t * renderer.moveTo(20, 20);\n\t * renderer.lineTo(200, 20);\n\t * renderer.stroke();\n\t * // Second path\n\t * renderer.beginPath();\n\t * renderer.setColor(\"green\");\n\t * renderer.moveTo(20, 20);\n\t * renderer.lineTo(120, 120);\n\t * renderer.stroke();\n\t */\n\tbeginPath() {\n\t\tthis.getContext().beginPath();\n\t}\n\n\t/**\n\t * begins a new sub-path at the point specified by the given (x, y) coordinates.\n\t * @param {number} x - The x axis of the point.\n\t * @param {number} y - The y axis of the point.\n\t */\n\tmoveTo(x, y) {\n\t\tthis.getContext().moveTo(x, y);\n\t}\n\n\t/**\n\t * adds a straight line to the current sub-path by connecting the sub-path's last point to the specified (x, y) coordinates.\n\t */\n\tlineTo(x, y) {\n\t\tthis.getContext().lineTo(x, y);\n\t}\n\n\t/**\n\t * creates a rectangular path whose starting point is at (x, y) and whose size is specified by width and height.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t */\n\trect(x, y, width, height) {\n\t\tthis.getContext().rect(x, y, width, height);\n\t}\n\n\t/**\n\t * adds a rounded rectangle to the current path.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t * @param {number} radius - The corner radius.\n\t */\n\troundRect(x, y, width, height, radii) {\n\t\tthis.getContext().roundRect(x, y, width, height, radii);\n\t}\n\n\t/**\n\t * stroke the given shape or the current defined path\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} [shape] - a shape object to stroke\n\t * @param {boolean} [fill=false] - fill the shape with the current color if true\n\t */\n\tstroke(shape, fill) {\n\t\tif (typeof shape === \"undefined\") {\n\t\t\tif (fill === true) {\n\t\t\t\tthis.getContext().fill();\n\t\t\t} else {\n\t\t\t\tthis.getContext().stroke();\n\t\t\t}\n\t\t} else {\n\t\t\tsuper.stroke(shape, fill);\n\t\t}\n\t}\n\n\t/**\n\t * fill the given shape or the current defined path\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} [shape] - a shape object to fill\n\t */\n\tfill(shape) {\n\t\tthis.stroke(shape, true);\n\t}\n\n\t/**\n\t * add a straight line from the current point to the start of the current sub-path. If the shape has already been closed or has only one point, this function does nothing\n\t */\n\tclosePath() {\n\t\tthis.getContext().closePath();\n\t}\n\n\t/**\n\t * Stroke an arc at the specified coordinates with given radius, start and end points\n\t * @param {number} x - arc center point x-axis\n\t * @param {number} y - arc center point y-axis\n\t * @param {number} radius\n\t * @param {number} start - start angle in radians\n\t * @param {number} end - end angle in radians\n\t * @param {boolean} [antiClockwise=false] - draw arc anti-clockwise\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeArc(x, y, radius, start, end, antiClockwise, fill = false) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\n\t\tcontext.translate(x, y);\n\t\tcontext.beginPath();\n\t\tcontext.arc(0, 0, radius, start, end, antiClockwise || false);\n\t\tcontext[fill === true ? \"fill\" : \"stroke\"]();\n\t\tcontext.translate(-x, -y);\n\t}\n\n\t/**\n\t * Fill an arc at the specified coordinates with given radius, start and end points\n\t * @param {number} x - arc center point x-axis\n\t * @param {number} y - arc center point y-axis\n\t * @param {number} radius\n\t * @param {number} start - start angle in radians\n\t * @param {number} end - end angle in radians\n\t * @param {boolean} [antiClockwise=false] - draw arc anti-clockwise\n\t */\n\tfillArc(x, y, radius, start, end, antiClockwise) {\n\t\tthis.strokeArc(x, y, radius, start, end, antiClockwise || false, true);\n\t}\n\n\t/**\n\t * Stroke an ellipse at the specified coordinates with given radius\n\t * @param {number} x - ellipse center point x-axis\n\t * @param {number} y - ellipse center point y-axis\n\t * @param {number} w - horizontal radius of the ellipse\n\t * @param {number} h - vertical radius of the ellipse\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeEllipse(x, y, w, h, fill = false) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\n\t\tconst hw = w;\n\t\tconst hh = h;\n\t\tconst lx = x - hw;\n\t\tconst rx = x + hw;\n\t\tconst ty = y - hh;\n\t\tconst by = y + hh;\n\n\t\tconst xmagic = hw * 0.551784;\n\t\tconst ymagic = hh * 0.551784;\n\t\tconst xmin = x - xmagic;\n\t\tconst xmax = x + xmagic;\n\t\tconst ymin = y - ymagic;\n\t\tconst ymax = y + ymagic;\n\n\t\tcontext.beginPath();\n\t\tcontext.moveTo(x, ty);\n\t\tcontext.bezierCurveTo(xmax, ty, rx, ymin, rx, y);\n\t\tcontext.bezierCurveTo(rx, ymax, xmax, by, x, by);\n\t\tcontext.bezierCurveTo(xmin, by, lx, ymax, lx, y);\n\t\tcontext.bezierCurveTo(lx, ymin, xmin, ty, x, ty);\n\t\tcontext[fill === true ? \"fill\" : \"stroke\"]();\n\t\tcontext.closePath();\n\t}\n\n\t/**\n\t * Fill an ellipse at the specified coordinates with given radius\n\t * @param {number} x - ellipse center point x-axis\n\t * @param {number} y - ellipse center point y-axis\n\t * @param {number} w - horizontal radius of the ellipse\n\t * @param {number} h - vertical radius of the ellipse\n\t */\n\tfillEllipse(x, y, w, h) {\n\t\tthis.strokeEllipse(x, y, w, h, true);\n\t}\n\n\t/**\n\t * Stroke a line of the given two points\n\t * @param {number} startX - the start x coordinate\n\t * @param {number} startY - the start y coordinate\n\t * @param {number} endX - the end x coordinate\n\t * @param {number} endY - the end y coordinate\n\t */\n\tstrokeLine(startX, startY, endX, endY) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\n\t\tconst context = this.getContext();\n\n\t\tcontext.beginPath();\n\t\tcontext.moveTo(startX, startY);\n\t\tcontext.lineTo(endX, endY);\n\t\tcontext.stroke();\n\t}\n\n\t/**\n\t * Fill a line of the given two points\n\t * @param {number} startX - the start x coordinate\n\t * @param {number} startY - the start y coordinate\n\t * @param {number} endX - the end x coordinate\n\t * @param {number} endY - the end y coordinate\n\t */\n\tfillLine(startX, startY, endX, endY) {\n\t\tthis.strokeLine(startX, startY, endX, endY);\n\t}\n\n\t/**\n\t * Stroke the given me.Polygon on the screen\n\t * @param {Polygon} poly - the shape to draw\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokePolygon(poly, fill = false) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\t\tconst points = poly.points;\n\t\tconst pointsLength = points.length;\n\t\tconst firstPoint = points[0];\n\n\t\tthis.translate(poly.pos.x, poly.pos.y);\n\n\t\tcontext.beginPath();\n\t\tcontext.moveTo(firstPoint.x, firstPoint.y);\n\t\tfor (let i = 1; i < pointsLength; i++) {\n\t\t\tconst point = points[i];\n\t\t\tcontext.lineTo(point.x, point.y);\n\t\t}\n\t\tcontext.lineTo(firstPoint.x, firstPoint.y);\n\t\tcontext[fill === true ? \"fill\" : \"stroke\"]();\n\t\tcontext.closePath();\n\n\t\tthis.translate(-poly.pos.x, -poly.pos.y);\n\t}\n\n\t/**\n\t * Fill the given me.Polygon on the screen\n\t * @param {Polygon} poly - the shape to draw\n\t */\n\tfillPolygon(poly) {\n\t\tthis.strokePolygon(poly, true);\n\t}\n\n\t/**\n\t * Stroke a rectangle at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeRect(x, y, width, height, fill = false) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\n\t\tcontext[fill === true ? \"fillRect\" : \"strokeRect\"](x, y, width, height);\n\t}\n\n\t/**\n\t * Draw a filled rectangle at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tfillRect(x, y, width, height) {\n\t\tthis.strokeRect(x, y, width, height, true);\n\t}\n\n\t/**\n\t * Stroke a rounded rectangle at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {number} radius\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeRoundRect(x, y, width, height, radius, fill = false) {\n\t\tif (this.getGlobalAlpha() < 1 / 255) {\n\t\t\t// Fast path: don't draw fully transparent\n\t\t\treturn;\n\t\t}\n\t\tconst context = this.getContext();\n\n\t\tcontext.beginPath();\n\t\tcontext.roundRect(x, y, width, height, radius);\n\t\tcontext[fill === true ? \"fill\" : \"stroke\"]();\n\t}\n\n\t/**\n\t * Draw a rounded filled rectangle at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {number} radius\n\t */\n\tfillRoundRect(x, y, width, height, radius) {\n\t\tthis.strokeRoundRect(x, y, width, height, radius, true);\n\t}\n\n\t/**\n\t * Stroke a Point at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t */\n\tstrokePoint(x, y) {\n\t\tthis.strokeLine(x, y, x + 1, y + 1);\n\t}\n\n\t/**\n\t * Draw a a point at the specified coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tfillPoint(x, y) {\n\t\tthis.strokePoint(x, y);\n\t}\n\n\t/**\n\t * restores the most recently saved renderer state by popping the top entry in the drawing state stack\n\t * @example\n\t * // Save the current state\n\t * renderer.save();\n\t *\n\t * // apply a transform and draw a rect\n\t * renderer.tranform(matrix);\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Restore to the state saved by the most recent call to save()\n\t * renderer.restore();\n\t */\n\trestore() {\n\t\tconst canvas = this.getCanvas();\n\t\tthis.getContext().restore();\n\t\tthis.currentColor.glArray[3] = this.getGlobalAlpha();\n\t\tthis.currentScissor[0] = 0;\n\t\tthis.currentScissor[1] = 0;\n\t\tthis.currentScissor[2] = canvas.width;\n\t\tthis.currentScissor[3] = canvas.height;\n\t}\n\n\t/**\n\t * saves the entire state of the renderer by pushing the current state onto a stack.\n\t * @example\n\t * // Save the current state\n\t * renderer.save();\n\t *\n\t * // apply a transform and draw a rect\n\t * renderer.tranform(matrix);\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Restore to the state saved by the most recent call to save()\n\t * renderer.restore();\n\t */\n\tsave() {\n\t\tthis.getContext().save();\n\t}\n\n\t/**\n\t * adds a rotation to the transformation matrix.\n\t * @param {number} angle - the rotation angle, clockwise in radians\n\t * @example\n\t * // Rotated rectangle\n\t * renderer.rotate((45 * Math.PI) / 180);\n\t * renderer.setColor(\"red\");\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Reset transformation matrix to the identity matrix\n\t * renderer.setTransform(1, 0, 0, 1, 0, 0);\n\t */\n\trotate(angle) {\n\t\tthis.getContext().rotate(angle);\n\t}\n\n\t/**\n\t * adds a scaling transformation to the renderer units horizontally and/or vertically\n\t * @param {number} x - Scaling factor in the horizontal direction. A negative value flips pixels across the vertical axis. A value of 1 results in no horizontal scaling.\n\t * @param {number} y - Scaling factor in the vertical direction. A negative value flips pixels across the horizontal axis. A value of 1 results in no vertical scaling\n\t */\n\tscale(x, y) {\n\t\tthis.getContext().scale(x, y);\n\t}\n\n\t/**\n\t * Set the current fill & stroke style color.\n\t * By default, or upon reset, the value is set to #000000.\n\t * @param {Color|string} color - css color value\n\t */\n\tsetColor(color) {\n\t\tconst currentColor = this.currentColor;\n\t\tconst context = this.getContext();\n\n\t\tcurrentColor.copy(color);\n\t\t// globalAlpha is applied at rendering time by the canvas\n\n\t\tcontext.strokeStyle = context.fillStyle = currentColor.toRGBA();\n\t}\n\n\t/**\n\t * Set the global alpha\n\t * @param {number} alpha - 0.0 to 1.0 values accepted.\n\t */\n\tsetGlobalAlpha(alpha) {\n\t\tthis.getContext().globalAlpha = alpha;\n\t}\n\n\t/**\n\t * Return the global alpha\n\t * @returns {number} global alpha value\n\t */\n\tgetGlobalAlpha() {\n\t\treturn this.getContext().globalAlpha;\n\t}\n\n\t/**\n\t * sets or returns the thickness of lines for shape drawing\n\t * @type {number}\n\t * @default 1\n\t */\n\tget lineWidth() {\n\t\treturn this.getContext().lineWidth;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tset lineWidth(value) {\n\t\tthis.getContext().lineWidth = value;\n\t}\n\n\t/**\n\t * sets or returns the shape used to join two line segments where they meet.\n\t * There are three possible values for this property: \"round\", \"bevel\", and \"miter\"\n\t * @type {string}\n\t * @default \"miter\"\n\t */\n\tget lineJoin() {\n\t\treturn this.getContext().lineJoin;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tset lineJoin(value) {\n\t\tconst context = this.getContext();\n\t\tcontext.lineJoin = value;\n\t}\n\n\t/**\n\t * Reset (overrides) the renderer transformation matrix to the\n\t * identity one, and then apply the given transformation matrix.\n\t * @param {Matrix2d|number} a - a matrix2d to transform by, or a the a component to multiply the current matrix by\n\t * @param {number} b - the b component to multiply the current matrix by\n\t * @param {number} c - the c component to multiply the current matrix by\n\t * @param {number} d - the d component to multiply the current matrix by\n\t * @param {number} e - the e component to multiply the current matrix by\n\t * @param {number} f - the f component to multiply the current matrix by\n\t */\n\tsetTransform(a, b, c, d, e, f) {\n\t\tthis.resetTransform();\n\t\tthis.transform(a, b, c, d, e, f);\n\t}\n\n\t/**\n\t * Multiply given matrix into the renderer tranformation matrix\n\t * @see {@link CanvasRenderer.setTransform} which will reset the current transform matrix prior to performing the new transformation\n\t * @param {Matrix2d|number} a - a matrix2d to transform by, or a the a component to multiply the current matrix by\n\t * @param {number} b - the b component to multiply the current matrix by\n\t * @param {number} c - the c component to multiply the current matrix by\n\t * @param {number} d - the d component to multiply the current matrix by\n\t * @param {number} e - the e component to multiply the current matrix by\n\t * @param {number} f - the f component to multiply the current matrix by\n\t */\n\ttransform(a, b, c, d, e, f) {\n\t\tif (typeof a === \"object\") {\n\t\t\tconst m = a.toArray();\n\t\t\ta = m[0];\n\t\t\tb = m[1];\n\t\t\tc = m[3];\n\t\t\td = m[4];\n\t\t\te = m[6];\n\t\t\tf = m[7];\n\t\t}\n\t\t// else individual components\n\n\t\tif (this.settings.subPixel === false) {\n\t\t\te |= 0;\n\t\t\tf |= 0;\n\t\t}\n\n\t\tthis.getContext().transform(a, b, c, d, e, f);\n\t}\n\n\t/**\n\t * adds a translation transformation to the current matrix.\n\t * @param {number} x - Distance to move in the horizontal direction. Positive values are to the right, and negative to the left.\n\t * @param {number} y - Distance to move in the vertical direction. Positive values are down, and negative are up.\n\t */\n\ttranslate(x, y) {\n\t\tif (this.settings.subPixel === false) {\n\t\t\tthis.getContext().translate(~~x, ~~y);\n\t\t} else {\n\t\t\tthis.getContext().translate(x, y);\n\t\t}\n\t}\n\n\t/**\n\t * clip the given region from the original canvas. Once a region is clipped,\n\t * all future drawing will be limited to the clipped region.\n\t * You can however save the current region using the save(),\n\t * and restore it (with the restore() method) any time in the future.\n\t * (<u>this is an experimental feature !</u>)\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tclipRect(x, y, width, height) {\n\t\tconst canvas = this.getCanvas();\n\t\t// if requested box is different from the current canvas size;\n\t\tif (\n\t\t\tx !== 0 ||\n\t\t\ty !== 0 ||\n\t\t\twidth !== canvas.width ||\n\t\t\theight !== canvas.height\n\t\t) {\n\t\t\tconst currentScissor = this.currentScissor;\n\t\t\t// if different from the current scissor box\n\t\t\tif (\n\t\t\t\tcurrentScissor[0] !== x ||\n\t\t\t\tcurrentScissor[1] !== y ||\n\t\t\t\tcurrentScissor[2] !== width ||\n\t\t\t\tcurrentScissor[3] !== height\n\t\t\t) {\n\t\t\t\tconst context = this.getContext();\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.rect(x, y, width, height);\n\t\t\t\tcontext.clip();\n\t\t\t\t// save the new currentScissor box\n\t\t\t\tcurrentScissor[0] = x;\n\t\t\t\tcurrentScissor[1] = y;\n\t\t\t\tcurrentScissor[2] = width;\n\t\t\t\tcurrentScissor[3] = height;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A mask limits rendering elements to the shape and position of the given mask object.\n\t * If the drawing or rendering area is larger than the mask, only the intersecting part of the renderable will be visible.\n\t * (Note Mask are not preserved through renderer context save and restore and need so be manually cleared)\n\t * @see CanvasRenderer#clearMask\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] - the shape defining the mask to be applied\n\t * @param {boolean} [invert=false] - either the given shape should define what is visible (default) or the opposite\n\t */\n\tsetMask(mask, invert = false) {\n\t\tconst context = this.getContext();\n\n\t\tif (this.maskLevel === 0) {\n\t\t\t// only save context on the first mask\n\t\t\tcontext.save();\n\t\t\tif (typeof mask !== \"undefined\") {\n\t\t\t\tcontext.beginPath();\n\t\t\t}\n\t\t\t// else use the current path\n\t\t}\n\n\t\tif (typeof mask !== \"undefined\") {\n\t\t\tswitch (mask.type) {\n\t\t\t\t// RoundRect\n\t\t\t\tcase \"RoundRect\":\n\t\t\t\t\tcontext.roundRect(\n\t\t\t\t\t\tmask.top,\n\t\t\t\t\t\tmask.left,\n\t\t\t\t\t\tmask.width,\n\t\t\t\t\t\tmask.height,\n\t\t\t\t\t\tmask.radius,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Rect or Bounds\n\t\t\t\tcase \"Rectangle\":\n\t\t\t\tcase \"Bounds\":\n\t\t\t\t\tcontext.rect(mask.top, mask.left, mask.width, mask.height);\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Polygon or Line\n\t\t\t\tcase \"Polygon\":\n\t\t\t\t\t{\n\t\t\t\t\t\t// polygon\n\t\t\t\t\t\tconst _x = mask.pos.x;\n\t\t\t\t\t\tconst _y = mask.pos.y;\n\t\t\t\t\t\tcontext.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);\n\t\t\t\t\t\tfor (let i = 1; i < mask.points.length; i++) {\n\t\t\t\t\t\t\tconst point = mask.points[i];\n\t\t\t\t\t\t\tcontext.lineTo(_x + point.x, _y + point.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"Ellipse\":\n\t\t\t\t\t{\n\t\t\t\t\t\tconst _x = mask.pos.x;\n\t\t\t\t\t\tconst _y = mask.pos.y;\n\t\t\t\t\t\tconst hw = mask.radiusV.x;\n\t\t\t\t\t\tconst hh = mask.radiusV.y;\n\t\t\t\t\t\tconst lx = _x - hw;\n\t\t\t\t\t\tconst rx = _x + hw;\n\t\t\t\t\t\tconst ty = _y - hh;\n\t\t\t\t\t\tconst by = _y + hh;\n\n\t\t\t\t\t\tconst xmagic = hw * 0.551784;\n\t\t\t\t\t\tconst ymagic = hh * 0.551784;\n\t\t\t\t\t\tconst xmin = _x - xmagic;\n\t\t\t\t\t\tconst xmax = _x + xmagic;\n\t\t\t\t\t\tconst ymin = _y - ymagic;\n\t\t\t\t\t\tconst ymax = _y + ymagic;\n\n\t\t\t\t\t\tcontext.moveTo(_x, ty);\n\t\t\t\t\t\tcontext.bezierCurveTo(xmax, ty, rx, ymin, rx, _y);\n\t\t\t\t\t\tcontext.bezierCurveTo(rx, ymax, xmax, by, _x, by);\n\t\t\t\t\t\tcontext.bezierCurveTo(xmin, by, lx, ymax, lx, _y);\n\t\t\t\t\t\tcontext.bezierCurveTo(lx, ymin, xmin, ty, _x, ty);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Invalid geometry for setMask\");\n\t\t\t}\n\t\t}\n\n\t\tthis.maskLevel++;\n\n\t\tif (invert === true) {\n\t\t\tcontext.closePath();\n\t\t\tcontext.globalCompositeOperation = \"destination-atop\";\n\t\t\tcontext.fill();\n\t\t} else {\n\t\t\tcontext.clip();\n\t\t}\n\t}\n\n\t/**\n\t * disable (remove) the rendering mask set through setMask.\n\t * @see CanvasRenderer#setMask\n\t */\n\tclearMask() {\n\t\tif (this.maskLevel > 0) {\n\t\t\tthis.maskLevel = 0;\n\t\t\tthis.getContext().restore();\n\t\t}\n\t}\n}\n", "import { Matrix2d } from \"../../math/matrix2d.ts\";\nimport { Bounds } from \"./../../physics/bounds.ts\";\nimport Sprite from \"./../../renderable/sprite.js\";\nimport {\n\tTMX_CLEAR_BIT_MASK,\n\tTMX_FLIP_AD,\n\tTMX_FLIP_H,\n\tTMX_FLIP_V,\n} from \"./constants.js\";\n\n/**\n * a basic tile object\n */\nexport default class Tile extends Bounds {\n\t/**\n\t * @param {number} x - x index of the Tile in the map\n\t * @param {number} y - y index of the Tile in the map\n\t * @param {number} gid - tile gid\n\t * @param {TMXTileset} tileset - the corresponding tileset object\n\t */\n\tconstructor(x, y, gid, tileset) {\n\t\tlet width;\n\t\tlet height;\n\n\t\t// call the parent constructor\n\t\tsuper();\n\n\t\t// determine the tile size\n\t\tif (tileset.isCollection) {\n\t\t\tconst image = tileset.getTileImage(gid & TMX_CLEAR_BIT_MASK);\n\t\t\twidth = image.width;\n\t\t\theight = image.height;\n\t\t} else {\n\t\t\twidth = tileset.tilewidth;\n\t\t\theight = tileset.tileheight;\n\t\t}\n\n\t\tthis.setMinMax(0, 0, width, height);\n\n\t\t/**\n\t\t * tileset\n\t\t * @type {TMXTileset}\n\t\t */\n\t\tthis.tileset = tileset;\n\n\t\t/**\n\t\t * the tile transformation matrix (if defined)\n\t\t * @ignore\n\t\t */\n\t\tthis.currentTransform = null;\n\n\t\t// Tile col / row pos\n\t\tthis.col = x;\n\t\tthis.row = y;\n\n\t\t/**\n\t\t * tileId\n\t\t * @type {number}\n\t\t */\n\t\tthis.tileId = gid;\n\n\t\t/**\n\t\t * True if the tile is flipped horizontally\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.flippedX = (this.tileId & TMX_FLIP_H) !== 0;\n\n\t\t/**\n\t\t * True if the tile is flipped vertically\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.flippedY = (this.tileId & TMX_FLIP_V) !== 0;\n\n\t\t/**\n\t\t * True if the tile is flipped anti-diagonally\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.flippedAD = (this.tileId & TMX_FLIP_AD) !== 0;\n\n\t\t/**\n\t\t * Global flag that indicates if the tile is flipped\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.flipped = this.flippedX || this.flippedY || this.flippedAD;\n\n\t\t// create and apply transformation matrix if required\n\t\tif (this.flipped === true) {\n\t\t\tif (this.currentTransform === null) {\n\t\t\t\tthis.currentTransform = new Matrix2d();\n\t\t\t}\n\t\t\tthis.setTileTransform(this.currentTransform.identity());\n\t\t}\n\n\t\t// clear out the flags and set the tileId\n\t\tthis.tileId &= TMX_CLEAR_BIT_MASK;\n\t}\n\n\t/**\n\t * set the transformation matrix for this tile\n\t * @ignore\n\t */\n\tsetTileTransform(transform) {\n\t\ttransform.translate(this.width / 2, this.height / 2);\n\t\tif (this.flippedAD) {\n\t\t\ttransform.rotate((-90 * Math.PI) / 180);\n\t\t\ttransform.scale(-1, 1);\n\t\t}\n\t\tif (this.flippedX) {\n\t\t\ttransform.scale(this.flippedAD ? 1 : -1, this.flippedAD ? -1 : 1);\n\t\t}\n\t\tif (this.flippedY) {\n\t\t\ttransform.scale(this.flippedAD ? -1 : 1, this.flippedAD ? 1 : -1);\n\t\t}\n\t\ttransform.translate(-this.width / 2, -this.height / 2);\n\t}\n\n\t/**\n\t * return a renderable object for this Tile object\n\t * @param {object} [settings] - see {@link Sprite}\n\t * @returns {Renderable} a me.Sprite object\n\t */\n\tgetRenderable(settings) {\n\t\tlet renderable;\n\t\tconst tileset = this.tileset;\n\n\t\tif (tileset.animations.has(this.tileId)) {\n\t\t\tconst frames = [];\n\t\t\tconst frameId = [];\n\t\t\ttileset.animations.get(this.tileId).frames.forEach((frame) => {\n\t\t\t\tframeId.push(frame.tileid);\n\t\t\t\tframes.push({\n\t\t\t\t\tname: \"\" + frame.tileid,\n\t\t\t\t\tdelay: frame.duration,\n\t\t\t\t});\n\t\t\t});\n\t\t\trenderable = tileset.texture.createAnimationFromName(frameId, settings);\n\t\t\trenderable.addAnimation(this.tileId - tileset.firstgid, frames);\n\t\t\trenderable.setCurrentAnimation(this.tileId - tileset.firstgid);\n\t\t} else {\n\t\t\tif (tileset.isCollection === true) {\n\t\t\t\tconst image = tileset.getTileImage(this.tileId);\n\t\t\t\trenderable = new Sprite(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tObject.assign({\n\t\t\t\t\t\timage: image,\n\t\t\t\t\t}), //, settings)\n\t\t\t\t);\n\t\t\t\trenderable.anchorPoint.set(0, 0);\n\t\t\t\trenderable.scale(\n\t\t\t\t\tsettings.width / this.width,\n\t\t\t\t\tsettings.height / this.height,\n\t\t\t\t);\n\t\t\t\tif (typeof settings.rotation !== \"undefined\") {\n\t\t\t\t\trenderable.anchorPoint.set(0.5, 0.5);\n\t\t\t\t\trenderable.currentTransform.rotate(settings.rotation);\n\t\t\t\t\trenderable.currentTransform.translate(\n\t\t\t\t\t\tsettings.width / 2,\n\t\t\t\t\t\tsettings.height / 2,\n\t\t\t\t\t);\n\t\t\t\t\t// TODO : move the rotation related code from TMXTiledMap to here (under)\n\t\t\t\t\tsettings.rotation = undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trenderable = tileset.texture.createSpriteFromName(\n\t\t\t\t\tthis.tileId - tileset.firstgid,\n\t\t\t\t\tsettings,\n\t\t\t\t);\n\t\t\t\trenderable.anchorPoint.set(0, 0);\n\t\t\t}\n\t\t}\n\n\t\t// any H/V flipping to apply?\n\t\tthis.setTileTransform(renderable.currentTransform);\n\n\t\treturn renderable;\n\t}\n}\n", "import { isBoolean, isNumeric } from \"../../utils/string.ts\";\n\n/**\n * the function used to decompress zlib/gzip data\n * @ignore\n */\nlet inflateFunction;\n\n/**\n * set and interpret a TMX property value\n * @ignore\n */\nfunction setTMXValue(name, type, value) {\n\tlet match;\n\n\tif (typeof value !== \"string\") {\n\t\t// Value is already normalized (e.g. with JSON maps)\n\t\treturn value;\n\t}\n\n\tswitch (type) {\n\t\tcase \"int\":\n\t\tcase \"float\":\n\t\t\tvalue = Number(value);\n\t\t\tbreak;\n\n\t\tcase \"bool\":\n\t\t\tvalue = value === \"true\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t// try to parse it anyway\n\t\t\tif (!value || isBoolean(value)) {\n\t\t\t\t// if value not defined or boolean\n\t\t\t\tvalue = value ? value === \"true\" : true;\n\t\t\t} else if (isNumeric(value)) {\n\t\t\t\t// check if numeric\n\t\t\t\tvalue = Number(value);\n\t\t\t} else if (value.search(/^json:/i) === 0) {\n\t\t\t\t// try to parse it\n\t\t\t\tmatch = value.split(/^json:/i)[1];\n\t\t\t\ttry {\n\t\t\t\t\tvalue = JSON.parse(match);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Unable to parse JSON: \" + match);\n\t\t\t\t}\n\t\t\t} else if (value.search(/^eval:/i) === 0) {\n\t\t\t\t// try to evaluate it\n\t\t\t\tmatch = value.split(/^eval:/i)[1];\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line\n\t\t\t\t\tvalue = Function(\"'use strict';return (\" + match + \")\")();\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Unable to evaluate: \" + match);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(match = value.match(/^#([\\da-fA-F])([\\da-fA-F]{3})$/)) ||\n\t\t\t\t(match = value.match(/^#([\\da-fA-F]{2})([\\da-fA-F]{6})$/))\n\t\t\t) {\n\t\t\t\tvalue = \"#\" + match[2] + match[1];\n\t\t\t}\n\n\t\t\t// normalize values\n\t\t\tif (name.search(/^(ratio|anchorPoint)$/) === 0) {\n\t\t\t\t// convert number to vector\n\t\t\t\tif (typeof value === \"number\") {\n\t\t\t\t\tvalue = {\n\t\t\t\t\t\tx: value,\n\t\t\t\t\t\ty: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t}\n\t// return the interpreted value\n\treturn value;\n}\n\n/**\n * @ignore\n */\nfunction parseAttributes(obj, elt) {\n\t// do attributes\n\tif (elt.attributes && elt.attributes.length > 0) {\n\t\tfor (let j = 0; j < elt.attributes.length; j++) {\n\t\t\tconst attribute = elt.attributes.item(j);\n\t\t\tif (typeof attribute.name !== \"undefined\") {\n\t\t\t\t// DOM4 (Attr no longer inherit from Node)\n\t\t\t\tobj[attribute.name] = attribute.value;\n\t\t\t} else {\n\t\t\t\t// else use the deprecated ones\n\t\t\t\tobj[attribute.nodeName] = attribute.nodeValue;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Normalize TMX format to Tiled JSON format\n * @ignore\n */\nfunction normalize(obj, item) {\n\tconst nodeName = item.nodeName;\n\n\tswitch (nodeName) {\n\t\tcase \"data\": {\n\t\t\tconst data = parse(item);\n\n\t\t\tdata.encoding = data.encoding || \"xml\";\n\n\t\t\t// decode chunks for infinite maps\n\t\t\tif (typeof data.chunks !== \"undefined\") {\n\t\t\t\tobj.chunks = obj.chunks || [];\n\t\t\t\t// infinite maps containing chunk data\n\t\t\t\tdata.chunks.forEach((chunk) => {\n\t\t\t\t\tobj.chunks.push({\n\t\t\t\t\t\tx: +chunk.x,\n\t\t\t\t\t\ty: +chunk.y,\n\t\t\t\t\t\t// chunk width is in tiles\n\t\t\t\t\t\twidth: +chunk.width,\n\t\t\t\t\t\t// chunk height is in tiles\n\t\t\t\t\t\theight: +chunk.height,\n\t\t\t\t\t\tdata: decode(chunk.text, data.encoding, data.compression),\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tobj.encoding = \"none\";\n\t\t\t}\n\t\t\t// Bug on if condition: when parsing data, data.text is sometimes defined when chunks are present\n\t\t\tif (\n\t\t\t\ttypeof data.text !== \"undefined\" &&\n\t\t\t\ttypeof obj.chunks === \"undefined\"\n\t\t\t) {\n\t\t\t\t// Finite maps\n\t\t\t\tobj.data = decode(data.text, data.encoding, data.compression);\n\t\t\t\tobj.encoding = \"none\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"chunk\":\n\t\t\tobj.chunks = obj.chunks || [];\n\t\t\tobj.chunks.push(parse(item));\n\t\t\tbreak;\n\n\t\tcase \"imagelayer\":\n\t\tcase \"layer\":\n\t\tcase \"objectgroup\":\n\t\tcase \"group\": {\n\t\t\tconst layer = parse(item);\n\t\t\tlayer.type = nodeName === \"layer\" ? \"tilelayer\" : nodeName;\n\t\t\tif (layer.image) {\n\t\t\t\tlayer.image = layer.image.source;\n\t\t\t}\n\n\t\t\tobj.layers = obj.layers || [];\n\t\t\tobj.layers.push(layer);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"animation\":\n\t\t\tobj.animation = parse(item).frames;\n\t\t\tbreak;\n\n\t\tcase \"frame\":\n\t\tcase \"object\": {\n\t\t\tconst name = nodeName + \"s\";\n\t\t\tobj[name] = obj[name] || [];\n\t\t\tobj[name].push(parse(item));\n\t\t\tbreak;\n\t\t}\n\t\tcase \"tile\": {\n\t\t\tconst tile = parse(item);\n\t\t\tif (tile.image) {\n\t\t\t\ttile.imagewidth = tile.image.width;\n\t\t\t\ttile.imageheight = tile.image.height;\n\t\t\t\ttile.image = tile.image.source;\n\t\t\t}\n\t\t\tobj.tiles = obj.tiles || {};\n\t\t\tobj.tiles[tile.id] = tile;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"tileset\": {\n\t\t\tconst tileset = parse(item);\n\t\t\tif (tileset.image) {\n\t\t\t\ttileset.imagewidth = tileset.image.width;\n\t\t\t\ttileset.imageheight = tileset.image.height;\n\t\t\t\ttileset.image = tileset.image.source;\n\t\t\t}\n\n\t\t\tobj.tilesets = obj.tilesets || [];\n\t\t\tobj.tilesets.push(tileset);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"polygon\":\n\t\tcase \"polyline\": {\n\t\t\tobj[nodeName] = [];\n\n\t\t\t// Get a point array\n\t\t\tconst points = parse(item).points.split(\" \");\n\n\t\t\t// And normalize them into an array of vectors\n\t\t\tfor (let i = 0; i < points.length; i++) {\n\t\t\t\tconst v = points[i].split(\",\");\n\t\t\t\tobj[nodeName].push({\n\t\t\t\t\tx: +v[0],\n\t\t\t\t\ty: +v[1],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase \"properties\":\n\t\t\tobj.properties = parse(item);\n\t\t\tbreak;\n\n\t\tcase \"property\": {\n\t\t\tconst property = parse(item);\n\t\t\t// for custom properties, text is used\n\t\t\tconst value =\n\t\t\t\ttypeof property.value !== \"undefined\" ? property.value : property.text;\n\n\t\t\tobj[property.name] = setTMXValue(\n\t\t\t\tproperty.name,\n\t\t\t\t// in XML type is undefined for \"string\" values\n\t\t\t\tproperty.type || \"string\",\n\t\t\t\tvalue,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tobj[nodeName] = parse(item);\n\t\t\tbreak;\n\t}\n}\n\n/**\n * a collection of utility functions for parsing TMX maps\n * @namespace TMXUtils\n */\n\n/**\n * decompress and decode zlib/gzip data\n * @memberof TMXUtils\n * @param {string} input - Base64 encoded and compressed data\n * @param {string} format - compressed data format (\"gzip\",\"zlib\", \"zstd\")\n * @returns {Uint32Array} Decoded and decompress data\n */\nfunction decompress(data, format) {\n\tif (typeof inflateFunction === \"function\") {\n\t\treturn inflateFunction(data, format);\n\t} else {\n\t\tthrow new Error(\"GZIP/ZLIB compressed TMX Tile Map not supported!\");\n\t}\n}\n\n/**\n * Decode a CSV encoded array into a binary array\n * @memberof TMXUtils\n * @param {string} input- - CSV formatted data (only numbers, everything else will be converted to NaN)\n * @returns {number[]} Decoded data\n */\nfunction decodeCSV(input) {\n\tconst entries = input.replace(\"\\n\", \"\").trim().split(\",\");\n\n\tconst result = [];\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tresult.push(+entries[i]);\n\t}\n\treturn result;\n}\n\n/**\n * Decode a base64 encoded string into a byte array\n * @memberof TMXUtils\n * @param {string} input - Base64 encoded data\n * @param {number} [bytes] - number of bytes per array entry\n * @returns {Uint32Array} Decoded data\n */\nfunction decodeBase64AsArray(input, bytes = 1) {\n\tconst dec = globalThis.atob(input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\"));\n\tconst ar = new Uint32Array(dec.length / bytes);\n\n\tfor (let i = 0, len = dec.length / bytes; i < len; i++) {\n\t\tar[i] = 0;\n\t\tfor (let j = bytes - 1; j >= 0; --j) {\n\t\t\tar[i] += dec.charCodeAt(i * bytes + j) << (j << 3);\n\t\t}\n\t}\n\treturn ar;\n}\n\n/**\n * set the function used to inflate gzip/zlib data\n * @memberof TMXUtils\n * @param {Func} fn - inflate function\n */\nexport function setInflateFunction(fn) {\n\tinflateFunction = fn;\n}\n\n/**\n * Decode a encoded array into a binary array\n * @memberof TMXUtils\n * @param {string} data - data to be decoded\n * @param {string} [encoding=\"none\"] - data encoding (\"csv\", \"base64\", \"xml\")\n * @returns {number[]} Decoded data\n */\nexport function decode(data, encoding, compression) {\n\tcompression = compression || \"none\";\n\tencoding = encoding || \"none\";\n\n\tswitch (encoding) {\n\t\tcase \"csv\":\n\t\t\treturn decodeCSV(data);\n\n\t\tcase \"base64\":\n\t\t\tif (compression !== \"none\") {\n\t\t\t\tdata = decompress(data, compression);\n\t\t\t} else {\n\t\t\t\tdata = decodeBase64AsArray(data, 4);\n\t\t\t}\n\t\t\treturn data;\n\n\t\tcase \"none\":\n\t\t\treturn data;\n\n\t\tcase \"xml\":\n\t\t\tthrow new Error(\"XML encoding is deprecated, use base64 instead\");\n\n\t\tdefault:\n\t\t\tthrow new Error(\"Unknown layer encoding: \" + encoding);\n\t}\n}\n\n/**\n * Parse a XML TMX object and returns the corresponding javascript object\n * @memberof TMXUtils\n * @param {Document} xml - XML TMX object\n * @returns {object} Javascript object\n */\nexport function parse(xml) {\n\t// Create the return object\n\tconst obj = {};\n\n\tlet text = \"\";\n\n\tif (xml.nodeType === 1) {\n\t\t// do attributes\n\t\tparseAttributes(obj, xml);\n\t}\n\n\t// do children\n\tif (xml.hasChildNodes()) {\n\t\tconst children = xml.childNodes;\n\t\tfor (const node of children) {\n\t\t\tswitch (node.nodeType) {\n\t\t\t\tcase 1:\n\t\t\t\t\tnormalize(obj, node);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\ttext += node.nodeValue.trim();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (text) {\n\t\tobj.text = text;\n\t}\n\n\treturn obj;\n}\n\n/**\n * Apply TMX Properties to the given object\n * @memberof TMXUtils\n * @param {object} obj - object to apply the properties to\n * @param {object} data - TMX data object\n * @returns {object} obj\n */\nexport function applyTMXProperties(obj, data) {\n\tconst properties = data.properties;\n\tconst types = data.propertytypes;\n\tif (typeof properties !== \"undefined\") {\n\t\tfor (const property in properties) {\n\t\t\tif (properties.hasOwnProperty(property)) {\n\t\t\t\tlet type = \"string\";\n\t\t\t\tlet name = property;\n\t\t\t\tlet value = properties[property];\n\t\t\t\t// proof-check for new and old JSON format\n\t\t\t\tif (typeof properties[property].name !== \"undefined\") {\n\t\t\t\t\tname = properties[property].name;\n\t\t\t\t}\n\t\t\t\tif (typeof types !== \"undefined\") {\n\t\t\t\t\ttype = types[property];\n\t\t\t\t} else if (typeof properties[property].type !== \"undefined\") {\n\t\t\t\t\ttype = properties[property].type;\n\t\t\t\t}\n\t\t\t\tif (typeof properties[property].value !== \"undefined\") {\n\t\t\t\t\tvalue = properties[property].value;\n\t\t\t\t}\n\t\t\t\t// set the value\n\t\t\t\tobj[name] = setTMXValue(name, type, value);\n\t\t\t}\n\t\t}\n\t}\n}\n", "import { vector2dPool } from \"../../math/vector2d.ts\";\nimport Renderable from \"./../../renderable/renderable.js\";\nimport CanvasRenderer from \"./../../video/canvas/canvas_renderer\";\nimport { createCanvas } from \"./../../video/video.js\";\nimport Tile from \"./TMXTile.js\";\nimport * as TMXUtils from \"./TMXUtils.js\";\n\n/**\n * Create required arrays for the given layer object\n * @ignore\n */\nfunction initArray(rows, cols) {\n\t// initialize the array\n\tconst array = new Array(cols);\n\tfor (let col = 0; col < cols; col++) {\n\t\tarray[col] = new Array(rows);\n\t\tfor (let row = 0; row < rows; row++) {\n\t\t\tarray[col][row] = null;\n\t\t}\n\t}\n\treturn array;\n}\n\n/**\n * Set a tiled layer Data\n * @ignore\n */\nfunction setLayerData(layer, bounds, data) {\n\tlet idx = 0;\n\tlet width;\n\tlet height;\n\n\t// layer provide rows and cols, chunk width and height\n\tif (typeof bounds.rows === \"undefined\") {\n\t\twidth = bounds.width;\n\t\theight = bounds.height;\n\t} else {\n\t\twidth = bounds.cols;\n\t\theight = bounds.rows;\n\t}\n\t// set everything\n\tfor (let y = 0; y < height; y++) {\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\t// get the value of the gid\n\t\t\tconst gid = data[idx++];\n\t\t\t// fill the array\n\t\t\tif (gid !== 0) {\n\t\t\t\t// add a new tile to the layer\n\t\t\t\tlayer.layerData[x + bounds.x][y + bounds.y] = layer.getTileById(\n\t\t\t\t\tgid,\n\t\t\t\t\tx + bounds.x,\n\t\t\t\t\ty + bounds.y,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * a TMX Tile Layer Object\n * Tiled QT 0.7.x format\n */\nexport default class TMXLayer extends Renderable {\n\t/**\n\t * @param {object} map - layer data in JSON format ({@link http://docs.mapeditor.org/en/stable/reference/tmx-map-format/#layer})\n\t * @param {object} data - layer data in JSON format ({@link http://docs.mapeditor.org/en/stable/reference/tmx-map-format/#layer})\n\t * @param {number} tilewidth - width of each tile in pixels\n\t * @param {number} tileheight - height of each tile in pixels\n\t * @param {string} orientation - \"isometric\" or \"orthogonal\"\n\t * @param {TMXTilesetGroup} tilesets - tileset as defined in Tiled\n\t * @param {number} z - z-index position\n\t */\n\tconstructor(map, data, tilewidth, tileheight, orientation, tilesets, z) {\n\t\t// super constructor\n\t\tsuper(0, 0, 0, 0);\n\n\t\t// tile width & height\n\t\tthis.tilewidth = data.tilewidth || tilewidth;\n\t\tthis.tileheight = data.tileheight || tileheight;\n\n\t\t// layer orientation\n\t\tthis.orientation = orientation;\n\n\t\t/**\n\t\t * Horizontal layer offset in tiles\n\t\t * @default 0\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = 0;\n\n\t\t/**\n\t\t * Vertical layer offset in tiles\n\t\t * @default 0\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = 0;\n\n\t\t/**\n\t\t * The Layer corresponding Tilesets\n\t\t * @type {TMXTilesetGroup}\n\t\t */\n\t\tthis.tilesets = tilesets;\n\n\t\t// the default tileset\n\t\t// XXX: Is this even used?\n\t\tthis.tileset = this.tilesets ? this.tilesets.getTilesetByIndex(0) : null;\n\n\t\t// Biggest tile size to draw\n\t\tthis.maxTileSize = {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t};\n\t\tfor (let i = 0; i < this.tilesets.length; i++) {\n\t\t\tconst tileset = this.tilesets.getTilesetByIndex(i);\n\t\t\tthis.maxTileSize.width = Math.max(\n\t\t\t\tthis.maxTileSize.width,\n\t\t\t\ttileset.tilewidth,\n\t\t\t);\n\t\t\tthis.maxTileSize.height = Math.max(\n\t\t\t\tthis.maxTileSize.height,\n\t\t\t\ttileset.tileheight,\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * All animated tilesets in this layer\n\t\t * @type {TMXTileset[]}\n\t\t */\n\t\tthis.animatedTilesets = [];\n\n\t\t/**\n\t\t * Layer contains tileset animations\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isAnimated = false;\n\n\t\t/**\n\t\t * the order in which tiles on orthogonal tile layers are rendered.\n\t\t * (valid values are \"left-down\", \"left-up\", \"right-down\", \"right-up\")\n\t\t * @type {string}\n\t\t * @default \"right-down\"\n\t\t */\n\t\tthis.renderorder = data.renderorder || \"right-down\";\n\n\t\t/**\n\t\t * the layer class\n\t\t * @type {string}\n\t\t */\n\t\tthis.class = data.class;\n\n\t\t// for displaying order\n\t\tthis.pos.z = z;\n\n\t\t// tiled default coordinates are top-left\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t// additional TMX flags\n\t\tthis.name = data.name;\n\t\tthis.cols = +data.width;\n\t\tthis.rows = +data.height;\n\n\t\t// layer opacity\n\t\tconst visible = typeof data.visible !== \"undefined\" ? +data.visible : 1;\n\t\tthis.setOpacity(visible ? +data.opacity : 0);\n\n\t\t// layer tint\n\t\tif (typeof data.tintcolor === \"string\") {\n\t\t\t// Tiled provides #RRGGBB or #AARRGGBB\n\t\t\tthis.tint.parseHex(data.tintcolor, true);\n\t\t}\n\n\t\t// layer \"real\" size\n\t\tif (this.orientation === \"isometric\") {\n\t\t\tthis.width = (this.cols + this.rows) * (this.tilewidth / 2);\n\t\t\tthis.height = (this.cols + this.rows) * (this.tileheight / 2);\n\t\t} else {\n\t\t\tthis.width = this.cols * this.tilewidth;\n\t\t\tthis.height = this.rows * this.tileheight;\n\t\t}\n\n\t\t// check if we have any user-defined properties\n\t\tTMXUtils.applyTMXProperties(this, data);\n\n\t\t// set a renderer\n\t\tthis.setRenderer(map.getRenderer());\n\n\t\t// initialize the data array\n\t\tthis.layerData = initArray(this.rows, this.cols);\n\n\t\tif (map.infinite === 0) {\n\t\t\t// initialize and set the layer data\n\t\t\tsetLayerData(\n\t\t\t\tthis,\n\t\t\t\tthis,\n\t\t\t\tTMXUtils.decode(data.data, data.encoding, data.compression),\n\t\t\t);\n\t\t} else if (map.infinite === 1) {\n\t\t\t// infinite map, initialize per chunk\n\t\t\tdata.chunks.forEach((chunk) => {\n\t\t\t\t// initialize and set the layer data\n\t\t\t\tsetLayerData(\n\t\t\t\t\tthis,\n\t\t\t\t\tchunk,\n\t\t\t\t\tTMXUtils.decode(chunk.data, data.encoding, data.compression),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t// called when the layer is added to the game world or a container\n\tonActivateEvent() {\n\t\tif (this.animatedTilesets === undefined) {\n\t\t\tthis.animatedTilesets = [];\n\t\t}\n\n\t\tif (this.tilesets) {\n\t\t\tconst tileset = this.tilesets.tilesets;\n\t\t\tfor (let i = 0; i < tileset.length; i++) {\n\t\t\t\tif (tileset[i].isAnimated) {\n\t\t\t\t\tthis.animatedTilesets.push(tileset[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.isAnimated = this.animatedTilesets.length > 0;\n\n\t\t// check for the correct rendering method\n\t\tif (typeof this.preRender === \"undefined\" && this.isAnimated === false) {\n\t\t\tthis.preRender = this.ancestor.getRootAncestor().preRender;\n\t\t} else {\n\t\t\t// Force pre-render off when tileset animation is used\n\t\t\tthis.preRender = false;\n\t\t}\n\n\t\t// if pre-rendering method is use, create an offline canvas/renderer\n\t\tif (this.preRender === true && !this.canvasRenderer) {\n\t\t\tthis.canvasRenderer = new CanvasRenderer({\n\t\t\t\tcanvas: createCanvas(this.width, this.height),\n\t\t\t\twidth: this.width,\n\t\t\t\theigth: this.height,\n\t\t\t\ttransparent: true,\n\t\t\t});\n\t\t\t// pre render the layer on the canvas\n\t\t\tthis.getRenderer().drawTileLayer(this.canvasRenderer, this, this);\n\t\t}\n\n\t\tthis.isDirty = true;\n\t}\n\n\t// called when the layer is removed from the game world or a container\n\tonDeactivateEvent() {\n\t\t// clear all allocated objects\n\t\t//this.layerData = undefined;\n\t\tthis.animatedTilesets = undefined;\n\t}\n\n\t/**\n\t * Set the TMX renderer for this layer object\n\t * @param {TMXRenderer} renderer\n\t * @example\n\t * // use the parent map default renderer\n\t * let layer = new me.TMXLayer(...);\n\t * layer.setRenderer(map.getRenderer());\n\t */\n\tsetRenderer(renderer) {\n\t\tthis.renderer = renderer;\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * Return the layer current renderer object\n\t * @returns {TMXRenderer} renderer\n\t */\n\tgetRenderer() {\n\t\treturn this.renderer;\n\t}\n\n\t/**\n\t * Return the TileId of the Tile at the specified position\n\t * @param {number} x - X coordinate (in world/pixels coordinates)\n\t * @param {number} y - Y coordinate (in world/pixels coordinates)\n\t * @returns {number} TileId or null if there is no Tile at the given position\n\t */\n\tgetTileId(x, y) {\n\t\tconst tile = this.getTile(x, y);\n\t\treturn tile ? tile.tileId : null;\n\t}\n\n\t/**\n\t * Return the Tile object at the specified position\n\t * @param {number} x - X coordinate (in world/pixels coordinates)\n\t * @param {number} y - Y coordinate (in world/pixels coordinates)\n\t * @returns {Tile} corresponding tile or null if there is no defined tile at the coordinate or if outside of the layer bounds\n\t * @example\n\t * // get the TMX Map Layer called \"Front layer\"\n\t * let layer = me.game.world.getChildByName(\"Front Layer\")[0];\n\t * // get the tile object corresponding to the latest pointer position\n\t * let tile = layer.getTile(me.input.pointer.x, me.input.pointer.y);\n\t */\n\tgetTile(x, y) {\n\t\tlet tile = null;\n\n\t\tif (this.contains(x, y)) {\n\t\t\tconst coord = this.getRenderer().pixelToTileCoords(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tvector2dPool.get(),\n\t\t\t);\n\t\t\ttile = this.cellAt(coord.x, coord.y);\n\t\t\tvector2dPool.release(coord);\n\t\t}\n\t\treturn tile;\n\t}\n\n\t/**\n\t * assign the given Tile object to the specified position\n\t * @param {Tile} tile - the tile object to be assigned\n\t * @param {number} x - x coordinate (in world/pixels coordinates)\n\t * @param {number} y - y coordinate (in world/pixels coordinates)\n\t * @returns {Tile} the tile object\n\t */\n\tsetTile(tile, x, y) {\n\t\tthis.layerData[x][y] = tile;\n\t\tthis.isDirty = true;\n\t\treturn tile;\n\t}\n\n\t/**\n\t * return a new the Tile object corresponding to the given tile id\n\t * @param {number} tileId - tileId\n\t * @param {number} x - X coordinate (in world/pixels coordinates)\n\t * @param {number} y - Y coordinate (in world/pixels coordinates)\n\t * @returns {Tile} the tile object\n\t */\n\tgetTileById(tileId, x, y) {\n\t\tif (!this.tileset.contains(tileId)) {\n\t\t\t// look for the corresponding tileset\n\t\t\tthis.tileset = this.tilesets.getTilesetByGid(tileId);\n\t\t}\n\t\treturn new Tile(x, y, tileId, this.tileset);\n\t}\n\n\t/**\n\t * Return the Tile object at the specified tile coordinates\n\t * @param {number} x - x position of the tile (in Tile unit)\n\t * @param {number} y - x position of the tile (in Tile unit)\n\t * @param {number} [boundsCheck=true] - check first if within the layer bounds\n\t * @returns {Tile} corresponding tile or null if there is no defined tile at the position or if outside of the layer bounds\n\t * @example\n\t * // return the first tile at offset 0, 0\n\t * let tile = layer.cellAt(0, 0);\n\t */\n\tcellAt(x, y, boundsCheck) {\n\t\tconst _x = ~~x;\n\t\tconst _y = ~~y;\n\n\t\tconst renderer = this.getRenderer();\n\t\t// boundsCheck only used internally by the tiled renderer, when the layer bound check was already done\n\t\tif (\n\t\t\tboundsCheck === false ||\n\t\t\t(_x >= 0 && _x < renderer.cols && _y >= 0 && _y < renderer.rows)\n\t\t) {\n\t\t\treturn this.layerData[_x][_y];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * clear the tile at the specified position\n\t * @param {number} x - X coordinate (in map coordinates: row/column)\n\t * @param {number} y - Y coordinate (in map coordinates: row/column)\n\t * @example\n\t * me.game.world.getChildByType(me.TMXLayer).forEach(function(layer) {\n\t * // clear all tiles at the given x,y coordinates\n\t * layer.clearTile(x, y);\n\t * });\n\t */\n\tclearTile(x, y) {\n\t\t// clearing tile\n\t\tthis.layerData[x][y] = null;\n\t\t// erase the corresponding area in the canvas\n\t\tif (this.preRender) {\n\t\t\tthis.canvasRenderer.clearRect(\n\t\t\t\tx * this.tilewidth,\n\t\t\t\ty * this.tileheight,\n\t\t\t\tthis.tilewidth,\n\t\t\t\tthis.tileheight,\n\t\t\t);\n\t\t}\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * update animations in a tileset layer\n\t * @ignore\n\t */\n\tupdate(dt) {\n\t\tlet result = this.isDirty;\n\t\tif (this.isAnimated) {\n\t\t\tfor (let i = 0; i < this.animatedTilesets.length; i++) {\n\t\t\t\tresult = this.animatedTilesets[i].update(dt) || result;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * draw a tileset layer\n\t * @ignore\n\t */\n\tdraw(renderer, rect) {\n\t\t// use the offscreen canvas\n\t\tif (this.preRender) {\n\t\t\tconst width = Math.min(rect.width, this.width);\n\t\t\tconst height = Math.min(rect.height, this.height);\n\n\t\t\t// draw using the cached canvas\n\t\t\trenderer.drawImage(\n\t\t\t\tthis.canvasRenderer.getCanvas(),\n\t\t\t\trect.pos.x,\n\t\t\t\trect.pos.y, // sx,sy\n\t\t\t\twidth,\n\t\t\t\theight, // sw,sh\n\t\t\t\trect.pos.x,\n\t\t\t\trect.pos.y, // dx,dy\n\t\t\t\twidth,\n\t\t\t\theight, // dw,dh\n\t\t\t);\n\t\t}\n\t\t// dynamically render the layer\n\t\telse {\n\t\t\t// draw the layer\n\t\t\tthis.getRenderer().drawTileLayer(renderer, this, rect);\n\t\t}\n\t}\n}\n", "import { Bounds, boundsPool } from \"./../../../physics/bounds.ts\";\nimport TMXLayer from \"./../TMXLayer.js\";\n\n/**\n * The map renderer base class\n */\nexport default class TMXRenderer {\n\t/**\n\t * @param {number} cols - width of the tilemap in tiles\n\t * @param {number} rows - height of the tilemap in tiles\n\t * @param {number} tilewidth - width of each tile in pixels\n\t * @param {number} tileheight - height of each tile in pixels\n\t */\n\tconstructor(cols, rows, tilewidth, tileheight) {\n\t\tthis.cols = cols;\n\t\tthis.rows = rows;\n\t\tthis.tilewidth = tilewidth;\n\t\tthis.tileheight = tileheight;\n\t\tthis.bounds = new Bounds();\n\t}\n\n\t/**\n\t * return true if the renderer can render the specified map or layer\n\t * @param {TMXTileMap|TMXLayer} component - TMX Map or Layer\n\t * @returns {boolean}\n\t */\n\tcanRender(component) {\n\t\treturn (\n\t\t\t/*\n // layers can have different size within\n // the same maps, so commenting these two lines\n (this.cols === component.cols) &&\n (this.rows === component.rows) &&\n */\n\t\t\tthis.tilewidth === component.tilewidth &&\n\t\t\tthis.tileheight === component.tileheight\n\t\t);\n\t}\n\n\t/**\n\t * return the bounding rect for this map renderer\n\t * @param {TMXLayer} [layer] - calculate the bounding rect for a specific layer (will return a new bounds object)\n\t * @returns {Bounds}\n\t */\n\tgetBounds(layer) {\n\t\tconst bounds = layer instanceof TMXLayer ? boundsPool.get() : this.bounds;\n\t\tbounds.setMinMax(\n\t\t\t0,\n\t\t\t0,\n\t\t\tthis.cols * this.tilewidth,\n\t\t\tthis.rows * this.tileheight,\n\t\t);\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * return the tile position corresponding to the specified pixel\n\t * @param {number} x - X coordinate\n\t * @param {number} y - Y coordinate\n\t * @param {Vector2d} [v] - an optional vector object where to put the return values\n\t * @returns {Vector2d}\n\t */\n\tpixelToTileCoords(x, y, v) {\n\t\treturn v;\n\t}\n\n\t/**\n\t * return the pixel position corresponding of the specified tile\n\t * @param {number} col - tile horizontal position\n\t * @param {number} row - tile vertical position\n\t * @param {Vector2d} [v] - an optional vector object where to put the return values\n\t * @returns {Vector2d}\n\t */\n\ttileToPixelCoords(col, row, v) {\n\t\treturn v;\n\t}\n\n\t/**\n\t * draw the given tile at the specified layer\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object\n\t * @param {number} x - X coordinate where to draw the tile\n\t * @param {number} y - Y coordinate where to draw the tile\n\t * @param {Tile} tile - the tile object to draw\n\t */\n\tdrawTile() {}\n\n\t/**\n\t * draw the given TMX Layer for the given area\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object\n\t * @param {TMXLayer} layer - a TMX Layer object\n\t * @param {Rect} rect - the area of the layer to draw\n\t */\n\tdrawTileLayer() {}\n}\n", "import { Vector2d, vector2dPool } from \"../../../math/vector2d.ts\";\nimport { boundsPool } from \"../../../physics/bounds.ts\";\nimport TMXLayer from \"./../TMXLayer.js\";\nimport TMXRenderer from \"./TMXRenderer.js\";\n\n// scope global variables & constants\nconst offsetsStaggerX = [\n\t{ x: 0, y: 0 },\n\t{ x: +1, y: -1 },\n\t{ x: +1, y: 0 },\n\t{ x: +2, y: 0 },\n];\nconst offsetsStaggerY = [\n\t{ x: 0, y: 0 },\n\t{ x: -1, y: +1 },\n\t{ x: 0, y: +1 },\n\t{ x: 0, y: +2 },\n];\n\n/**\n * an Hexagonal Map Renderder\n */\nexport default class TMXHexagonalRenderer extends TMXRenderer {\n\t/**\n\t * @param {TMXTileMap} map - the TMX map\n\t */\n\tconstructor(map) {\n\t\tsuper(map.cols, map.rows, map.tilewidth & ~1, map.tileheight & ~1);\n\n\t\tthis.hexsidelength = map.hexsidelength || 0;\n\t\tthis.staggerX = map.staggeraxis === \"x\";\n\t\tthis.staggerEven = map.staggerindex === \"even\";\n\n\t\tthis.sidelengthx = 0;\n\t\tthis.sidelengthy = 0;\n\n\t\tif (map.orientation === \"hexagonal\") {\n\t\t\tif (this.staggerX) {\n\t\t\t\tthis.sidelengthx = this.hexsidelength;\n\t\t\t} else {\n\t\t\t\tthis.sidelengthy = this.hexsidelength;\n\t\t\t}\n\t\t}\n\n\t\tthis.sideoffsetx = (this.tilewidth - this.sidelengthx) / 2;\n\t\tthis.sideoffsety = (this.tileheight - this.sidelengthy) / 2;\n\n\t\tthis.columnwidth = this.sideoffsetx + this.sidelengthx;\n\t\tthis.rowheight = this.sideoffsety + this.sidelengthy;\n\n\t\tthis.centers = [\n\t\t\tnew Vector2d(),\n\t\t\tnew Vector2d(),\n\t\t\tnew Vector2d(),\n\t\t\tnew Vector2d(),\n\t\t];\n\t}\n\n\t/**\n\t * return true if the renderer can render the specified layer\n\t * @ignore\n\t */\n\tcanRender(layer) {\n\t\treturn layer.orientation === \"hexagonal\" && super.canRender(layer);\n\t}\n\n\t/**\n\t * return the bounding rect for this map renderer\n\t * @ignore\n\t */\n\tgetBounds(layer) {\n\t\tconst bounds = layer instanceof TMXLayer ? boundsPool.get() : this.bounds;\n\n\t\t// The map size is the same regardless of which indexes are shifted.\n\t\tif (this.staggerX) {\n\t\t\tbounds.setMinMax(\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tthis.cols * this.columnwidth + this.sideoffsetx,\n\t\t\t\tthis.rows * (this.tileheight + this.sidelengthy),\n\t\t\t);\n\t\t\tif (bounds.width > 1) {\n\t\t\t\tbounds.height += this.rowheight;\n\t\t\t}\n\t\t} else {\n\t\t\tbounds.setMinMax(\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tthis.cols * (this.tilewidth + this.sidelengthx),\n\t\t\t\tthis.rows * this.rowheight + this.sideoffsety,\n\t\t\t);\n\t\t\tif (bounds.height > 1) {\n\t\t\t\tbounds.width += this.columnwidth;\n\t\t\t}\n\t\t}\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tdoStaggerX(x) {\n\t\treturn this.staggerX && (x & 1) ^ this.staggerEven;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tdoStaggerY(y) {\n\t\treturn !this.staggerX && (y & 1) ^ this.staggerEven;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttopLeft(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (!this.staggerX) {\n\t\t\tif ((y & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x, y - 1);\n\t\t\t} else {\n\t\t\t\tret.set(x - 1, y - 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif ((x & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x - 1, y);\n\t\t\t} else {\n\t\t\t\tret.set(x - 1, y - 1);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttopRight(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (!this.staggerX) {\n\t\t\tif ((y & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x + 1, y - 1);\n\t\t\t} else {\n\t\t\t\tret.set(x, y - 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif ((x & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x + 1, y);\n\t\t\t} else {\n\t\t\t\tret.set(x + 1, y - 1);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tbottomLeft(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (!this.staggerX) {\n\t\t\tif ((y & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x, y + 1);\n\t\t\t} else {\n\t\t\t\tret.set(x - 1, y + 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif ((x & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x - 1, y + 1);\n\t\t\t} else {\n\t\t\t\tret.set(x - 1, y);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tbottomRight(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (!this.staggerX) {\n\t\t\tif ((y & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x + 1, y + 1);\n\t\t\t} else {\n\t\t\t\tret.set(x, y + 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif ((x & 1) ^ this.staggerEven) {\n\t\t\t\tret.set(x + 1, y + 1);\n\t\t\t} else {\n\t\t\t\tret.set(x + 1, y);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/**\n\t * return the tile position corresponding to the specified pixel\n\t * @ignore\n\t */\n\tpixelToTileCoords(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (this.staggerX) {\n\t\t\t//flat top\n\t\t\tx -= this.staggerEven ? this.tilewidth : this.sideoffsetx;\n\t\t} else {\n\t\t\t//pointy top\n\t\t\ty -= this.staggerEven ? this.tileheight : this.sideoffsety;\n\t\t}\n\n\t\t// Start with the coordinates of a grid-aligned tile\n\t\tconst referencePoint = vector2dPool.get(\n\t\t\tMath.floor(x / (this.columnwidth * 2)),\n\t\t\tMath.floor(y / (this.rowheight * 2)),\n\t\t);\n\n\t\t// Relative x and y position on the base square of the grid-aligned tile\n\t\tconst rel = vector2dPool.get(\n\t\t\tx - referencePoint.x * (this.columnwidth * 2),\n\t\t\ty - referencePoint.y * (this.rowheight * 2),\n\t\t);\n\n\t\t// Adjust the reference point to the correct tile coordinates\n\t\tif (this.staggerX) {\n\t\t\treferencePoint.x = referencePoint.x * 2;\n\t\t\tif (this.staggerEven) {\n\t\t\t\t++referencePoint.x;\n\t\t\t}\n\t\t} else {\n\t\t\treferencePoint.y = referencePoint.y * 2;\n\t\t\tif (this.staggerEven) {\n\t\t\t\t++referencePoint.y;\n\t\t\t}\n\t\t}\n\n\t\t// Determine the nearest hexagon tile by the distance to the center\n\t\tlet left;\n\t\tlet top;\n\t\tlet centerX;\n\t\tlet centerY;\n\t\tif (this.staggerX) {\n\t\t\tleft = this.sidelengthx / 2;\n\t\t\tcenterX = left + this.columnwidth;\n\t\t\tcenterY = this.tileheight / 2;\n\n\t\t\tthis.centers[0].set(left, centerY);\n\t\t\tthis.centers[1].set(centerX, centerY - this.rowheight);\n\t\t\tthis.centers[2].set(centerX, centerY + this.rowheight);\n\t\t\tthis.centers[3].set(centerX + this.columnwidth, centerY);\n\t\t} else {\n\t\t\ttop = this.sidelengthy / 2;\n\t\t\tcenterX = this.tilewidth / 2;\n\t\t\tcenterY = top + this.rowheight;\n\n\t\t\tthis.centers[0].set(centerX, top);\n\t\t\tthis.centers[1].set(centerX - this.columnwidth, centerY);\n\t\t\tthis.centers[2].set(centerX + this.columnwidth, centerY);\n\t\t\tthis.centers[3].set(centerX, centerY + this.rowheight);\n\t\t}\n\n\t\tlet nearest = 0;\n\t\tlet minDist = Number.MAX_VALUE;\n\t\tfor (let i = 0; i < 4; ++i) {\n\t\t\tconst dc = this.centers[i].sub(rel).length2();\n\t\t\tif (dc < minDist) {\n\t\t\t\tminDist = dc;\n\t\t\t\tnearest = i;\n\t\t\t}\n\t\t}\n\n\t\tconst offsets = this.staggerX ? offsetsStaggerX : offsetsStaggerY;\n\n\t\tret.set(\n\t\t\treferencePoint.x + offsets[nearest].x,\n\t\t\treferencePoint.y + offsets[nearest].y,\n\t\t);\n\n\t\tvector2dPool.release(referencePoint);\n\t\tvector2dPool.release(rel);\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * return the pixel position corresponding of the specified tile\n\t * @ignore\n\t */\n\ttileToPixelCoords(x, y, v) {\n\t\tconst tileX = Math.floor(x);\n\t\tconst tileY = Math.floor(y);\n\t\tconst ret = v || new Vector2d();\n\n\t\tif (this.staggerX) {\n\t\t\tret.y = tileY * (this.tileheight + this.sidelengthy);\n\t\t\tif (this.doStaggerX(tileX)) {\n\t\t\t\tret.y += this.rowheight;\n\t\t\t}\n\t\t\tret.x = tileX * this.columnwidth;\n\t\t} else {\n\t\t\tret.x = tileX * (this.tilewidth + this.sidelengthx);\n\t\t\tif (this.doStaggerY(tileY)) {\n\t\t\t\tret.x += this.columnwidth;\n\t\t\t}\n\t\t\tret.y = tileY * this.rowheight;\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * fix the position of Objects to match\n\t * the way Tiled places them\n\t * @ignore\n\t */\n\tadjustPosition(obj) {\n\t\t// only adjust position if obj.gid is defined\n\t\tif (typeof obj.gid === \"number\") {\n\t\t\t// Tiled objects origin point is \"bottom-left\" in Tiled,\n\t\t\t// \"top-left\" in melonJS)\n\t\t\tobj.y -= obj.height;\n\t\t}\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTile(renderer, x, y, tmxTile) {\n\t\tconst tileset = tmxTile.tileset;\n\t\tconst point = this.tileToPixelCoords(x, y, vector2dPool.get());\n\n\t\t// draw the tile\n\t\ttileset.drawTile(\n\t\t\trenderer,\n\t\t\ttileset.tileoffset.x + point.x,\n\t\t\ttileset.tileoffset.y + point.y + (this.tileheight - tileset.tileheight),\n\t\t\ttmxTile,\n\t\t);\n\n\t\tvector2dPool.release(point);\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTileLayer(renderer, layer, rect) {\n\t\tlet tile;\n\n\t\t// get top-left and bottom-right tile position\n\t\tconst startTile = this.pixelToTileCoords(\n\t\t\trect.pos.x,\n\t\t\trect.pos.y,\n\t\t\tvector2dPool.get(),\n\t\t);\n\n\t\t// Compensate for the layer position\n\t\tstartTile.sub(layer.pos);\n\n\t\t// get top-left and bottom-right tile position\n\t\tlet startPos = this.tileToPixelCoords(\n\t\t\tstartTile.x + layer.pos.x,\n\t\t\tstartTile.y + layer.pos.y,\n\t\t\tvector2dPool.get(),\n\t\t);\n\n\t\tconst rowTile = startTile.clone();\n\t\tconst rowPos = startPos.clone();\n\n\t\t/* Determine in which half of the tile the top-left corner of the area we\n\t\t * need to draw is. If we're in the upper half, we need to start one row\n\t\t * up due to those tiles being visible as well. How we go up one row\n\t\t * depends on whether we're in the left or right half of the tile.\n\t\t */\n\t\tconst inUpperHalf = rect.pos.y - startPos.y < this.sideoffsety;\n\t\tconst inLeftHalf = rect.pos.x - startPos.x < this.sideoffsetx;\n\n\t\tif (inUpperHalf) {\n\t\t\tstartTile.y--;\n\t\t}\n\t\tif (inLeftHalf) {\n\t\t\tstartTile.x--;\n\t\t}\n\n\t\tconst endX = layer.cols;\n\t\tconst endY = layer.rows;\n\n\t\tif (this.staggerX) {\n\t\t\t//ensure we are in the valid tile range\n\t\t\tstartTile.x = Math.max(0, startTile.x);\n\t\t\tstartTile.y = Math.max(0, startTile.y);\n\n\t\t\tstartPos = this.tileToPixelCoords(\n\t\t\t\tstartTile.x + layer.pos.x,\n\t\t\t\tstartTile.y + layer.pos.y,\n\t\t\t\tstartPos,\n\t\t\t);\n\n\t\t\tlet staggeredRow = this.doStaggerX(startTile.x + layer.pos.x);\n\n\t\t\t// main drawing loop\n\t\t\tfor (; startPos.y < rect.bottom && startTile.y < endY; ) {\n\t\t\t\trowTile.setV(startTile);\n\t\t\t\trowPos.setV(startPos);\n\n\t\t\t\tfor (; rowPos.x < rect.right && rowTile.x < endX; rowTile.x += 2) {\n\t\t\t\t\ttile = layer.cellAt(rowTile.x, rowTile.y, false);\n\t\t\t\t\tif (tile) {\n\t\t\t\t\t\t// draw the tile\n\t\t\t\t\t\ttile.tileset.drawTile(renderer, rowPos.x, rowPos.y, tile);\n\t\t\t\t\t}\n\t\t\t\t\trowPos.x += this.tilewidth + this.sidelengthx;\n\t\t\t\t}\n\n\t\t\t\tif (staggeredRow) {\n\t\t\t\t\tstartTile.x -= 1;\n\t\t\t\t\tstartTile.y += 1;\n\t\t\t\t\tstartPos.x -= this.columnwidth;\n\t\t\t\t\tstaggeredRow = false;\n\t\t\t\t} else {\n\t\t\t\t\tstartTile.x += 1;\n\t\t\t\t\tstartPos.x += this.columnwidth;\n\t\t\t\t\tstaggeredRow = true;\n\t\t\t\t}\n\n\t\t\t\tstartPos.y += this.rowheight;\n\t\t\t}\n\t\t\tvector2dPool.release(rowTile);\n\t\t\tvector2dPool.release(rowPos);\n\t\t} else {\n\t\t\t//ensure we are in the valid tile range\n\t\t\tstartTile.x = Math.max(0, startTile.x);\n\t\t\tstartTile.y = Math.max(0, startTile.y);\n\n\t\t\tstartPos = this.tileToPixelCoords(\n\t\t\t\tstartTile.x + layer.pos.x,\n\t\t\t\tstartTile.y + layer.pos.y,\n\t\t\t\tstartPos,\n\t\t\t);\n\n\t\t\t// Odd row shifting is applied in the rendering loop, so un-apply it here\n\t\t\tif (this.doStaggerY(startTile.y)) {\n\t\t\t\tstartPos.x -= this.columnwidth;\n\t\t\t}\n\n\t\t\t// main drawing loop\n\t\t\tfor (; startPos.y < rect.bottom && startTile.y < endY; startTile.y++) {\n\t\t\t\trowTile.setV(startTile);\n\t\t\t\trowPos.setV(startPos);\n\n\t\t\t\tif (this.doStaggerY(startTile.y)) {\n\t\t\t\t\trowPos.x += this.columnwidth;\n\t\t\t\t}\n\n\t\t\t\tfor (; rowPos.x < rect.right && rowTile.x < endX; rowTile.x++) {\n\t\t\t\t\ttile = layer.cellAt(rowTile.x, rowTile.y, false);\n\t\t\t\t\tif (tile) {\n\t\t\t\t\t\t// draw the tile\n\t\t\t\t\t\ttile.tileset.drawTile(renderer, rowPos.x, rowPos.y, tile);\n\t\t\t\t\t}\n\t\t\t\t\trowPos.x += this.tilewidth + this.sidelengthx;\n\t\t\t\t}\n\t\t\t\tstartPos.y += this.rowheight;\n\t\t\t}\n\t\t\tvector2dPool.release(rowTile);\n\t\t\tvector2dPool.release(rowPos);\n\t\t}\n\n\t\tvector2dPool.release(startTile);\n\t\tvector2dPool.release(startPos);\n\t}\n}\n", "import { Vector2d, vector2dPool } from \"../../../math/vector2d.ts\";\nimport { boundsPool } from \"../../../physics/bounds.ts\";\nimport TMXLayer from \"./../TMXLayer.js\";\nimport TMXRenderer from \"./TMXRenderer.js\";\n\n/**\n * an Isometric Map Renderder\n */\nexport default class TMXIsometricRenderer extends TMXRenderer {\n\t/**\n\t * @param {TMXTileMap} map - the TMX map\n\t */\n\tconstructor(map) {\n\t\tsuper(map.cols, map.rows, map.tilewidth, map.tileheight);\n\n\t\tthis.hTilewidth = this.tilewidth / 2;\n\t\tthis.hTileheight = this.tileheight / 2;\n\t\tthis.originX = this.rows * this.hTilewidth;\n\t}\n\n\t/**\n\t * return true if the renderer can render the specified layer\n\t * @ignore\n\t */\n\tcanRender(layer) {\n\t\treturn layer.orientation === \"isometric\" && super.canRender(layer);\n\t}\n\n\t/**\n\t * return the bounding rect for this map renderer\n\t * @ignore\n\t */\n\tgetBounds(layer) {\n\t\tconst bounds = layer instanceof TMXLayer ? boundsPool.get() : this.bounds;\n\t\tbounds.setMinMax(\n\t\t\t0,\n\t\t\t0,\n\t\t\t(this.cols + this.rows) * (this.tilewidth / 2),\n\t\t\t(this.cols + this.rows) * (this.tileheight / 2),\n\t\t);\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * return the tile position corresponding to the specified pixel\n\t * @ignore\n\t */\n\tpixelToTileCoords(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\t\treturn ret.set(\n\t\t\ty / this.tileheight + (x - this.originX) / this.tilewidth,\n\t\t\ty / this.tileheight - (x - this.originX) / this.tilewidth,\n\t\t);\n\t}\n\n\t/**\n\t * return the pixel position corresponding of the specified tile\n\t * @ignore\n\t */\n\ttileToPixelCoords(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\t\treturn ret.set(\n\t\t\t(x - y) * this.hTilewidth + this.originX,\n\t\t\t(x + y) * this.hTileheight,\n\t\t);\n\t}\n\n\t/**\n\t * fix the position of Objects to match\n\t * the way Tiled places them\n\t * @ignore\n\t */\n\tadjustPosition(obj) {\n\t\tconst tileX = obj.x / this.hTilewidth;\n\t\tconst tileY = obj.y / this.tileheight;\n\t\tconst isoPos = vector2dPool.get();\n\n\t\tthis.tileToPixelCoords(tileX, tileY, isoPos);\n\n\t\tobj.x = isoPos.x;\n\t\tobj.y = isoPos.y;\n\n\t\tvector2dPool.release(isoPos);\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTile(renderer, x, y, tmxTile) {\n\t\tconst tileset = tmxTile.tileset;\n\t\t// draw the tile\n\t\ttileset.drawTile(\n\t\t\trenderer,\n\t\t\t((this.cols - 1) * tileset.tilewidth + (x - y) * tileset.tilewidth) >> 1,\n\t\t\t(-tileset.tilewidth + (x + y) * tileset.tileheight) >> 2,\n\t\t\ttmxTile,\n\t\t);\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTileLayer(renderer, layer, rect) {\n\t\t// cache a couple of useful references\n\t\tlet tileset = layer.tileset;\n\n\t\t// get top-left and bottom-right tile position\n\t\tconst rowItr = this.pixelToTileCoords(\n\t\t\trect.pos.x - tileset.tilewidth,\n\t\t\trect.pos.y - tileset.tileheight,\n\t\t\tvector2dPool.get(),\n\t\t).floorSelf();\n\t\tconst tileEnd = this.pixelToTileCoords(\n\t\t\trect.pos.x + rect.width + tileset.tilewidth,\n\t\t\trect.pos.y + rect.height + tileset.tileheight,\n\t\t\tvector2dPool.get(),\n\t\t).ceilSelf();\n\n\t\tconst rectEnd = this.tileToPixelCoords(\n\t\t\ttileEnd.x,\n\t\t\ttileEnd.y,\n\t\t\tvector2dPool.get(),\n\t\t);\n\n\t\t// Determine the tile and pixel coordinates to start at\n\t\tconst startPos = this.tileToPixelCoords(\n\t\t\trowItr.x,\n\t\t\trowItr.y,\n\t\t\tvector2dPool.get(),\n\t\t);\n\t\tstartPos.x -= this.hTilewidth;\n\t\tstartPos.y += this.tileheight;\n\n\t\t/* Determine in which half of the tile the top-left corner of the area we\n\t\t * need to draw is. If we're in the upper half, we need to start one row\n\t\t * up due to those tiles being visible as well. How we go up one row\n\t\t * depends on whether we're in the left or right half of the tile.\n\t\t */\n\t\tconst inUpperHalf = startPos.y - rect.pos.y > this.hTileheight;\n\t\tconst inLeftHalf = rect.pos.x - startPos.x < this.hTilewidth;\n\n\t\tif (inUpperHalf) {\n\t\t\tif (inLeftHalf) {\n\t\t\t\trowItr.x--;\n\t\t\t\tstartPos.x -= this.hTilewidth;\n\t\t\t} else {\n\t\t\t\trowItr.y--;\n\t\t\t\tstartPos.x += this.hTilewidth;\n\t\t\t}\n\t\t\tstartPos.y -= this.hTileheight;\n\t\t}\n\n\t\t// Determine whether the current row is shifted half a tile to the right\n\t\tlet shifted = inUpperHalf ^ inLeftHalf;\n\n\t\t// initialize the columItr vector\n\t\tconst columnItr = rowItr.clone();\n\n\t\t// main drawing loop\n\t\tfor (\n\t\t\tlet y = startPos.y * 2;\n\t\t\ty - this.tileheight * 2 < rectEnd.y * 2;\n\t\t\ty += this.tileheight\n\t\t) {\n\t\t\tcolumnItr.setV(rowItr);\n\t\t\tfor (let x = startPos.x; x < rectEnd.x; x += this.tilewidth) {\n\t\t\t\tconst tmxTile = layer.cellAt(columnItr.x, columnItr.y);\n\t\t\t\t// render if a valid tile position\n\t\t\t\tif (tmxTile) {\n\t\t\t\t\ttileset = tmxTile.tileset;\n\t\t\t\t\t// offset could be different per tileset\n\t\t\t\t\tconst offset = tileset.tileoffset;\n\t\t\t\t\t// draw our tile\n\t\t\t\t\ttileset.drawTile(\n\t\t\t\t\t\trenderer,\n\t\t\t\t\t\toffset.x + x,\n\t\t\t\t\t\toffset.y + y / 2 - tileset.tileheight,\n\t\t\t\t\t\ttmxTile,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Advance to the next column\n\t\t\t\tcolumnItr.x++;\n\t\t\t\tcolumnItr.y--;\n\t\t\t}\n\n\t\t\t// Advance to the next row\n\t\t\tif (!shifted) {\n\t\t\t\trowItr.x++;\n\t\t\t\tstartPos.x += this.hTilewidth;\n\t\t\t\tshifted = true;\n\t\t\t} else {\n\t\t\t\trowItr.y++;\n\t\t\t\tstartPos.x -= this.hTilewidth;\n\t\t\t\tshifted = false;\n\t\t\t}\n\t\t}\n\n\t\tvector2dPool.release(columnItr);\n\t\tvector2dPool.release(rowItr);\n\t\tvector2dPool.release(tileEnd);\n\t\tvector2dPool.release(rectEnd);\n\t\tvector2dPool.release(startPos);\n\t}\n}\n", "import { Vector2d, vector2dPool } from \"../../../math/vector2d.ts\";\nimport TMXRenderer from \"./TMXRenderer.js\";\n\n/**\n * an Orthogonal Map Renderder\n */\nexport default class TMXOrthogonalRenderer extends TMXRenderer {\n\t/**\n\t * @param {TMXTileMap} map - the TMX map\n\t */\n\tconstructor(map) {\n\t\tsuper(map.cols, map.rows, map.tilewidth, map.tileheight);\n\t}\n\n\t/**\n\t * return true if the renderer can render the specified layer\n\t * @ignore\n\t */\n\tcanRender(layer) {\n\t\treturn layer.orientation === \"orthogonal\" && super.canRender(layer);\n\t}\n\n\t/**\n\t * return the tile position corresponding to the specified pixel\n\t * @ignore\n\t */\n\tpixelToTileCoords(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\t\treturn ret.set(x / this.tilewidth, y / this.tileheight);\n\t}\n\n\t/**\n\t * return the pixel position corresponding of the specified tile\n\t * @ignore\n\t */\n\ttileToPixelCoords(x, y, v) {\n\t\tconst ret = v || new Vector2d();\n\t\treturn ret.set(x * this.tilewidth, y * this.tileheight);\n\t}\n\n\t/**\n\t * fix the position of Objects to match\n\t * the way Tiled places them\n\t * @ignore\n\t */\n\tadjustPosition(obj) {\n\t\t// only adjust position if obj.gid is defined\n\t\tif (typeof obj.gid === \"number\") {\n\t\t\t// Tiled objects origin point is \"bottom-left\" in Tiled,\n\t\t\t// \"top-left\" in melonJS)\n\t\t\tobj.y -= obj.height;\n\t\t}\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTile(renderer, x, y, tmxTile) {\n\t\tconst tileset = tmxTile.tileset;\n\t\t// draw the tile\n\t\ttileset.drawTile(\n\t\t\trenderer,\n\t\t\ttileset.tileoffset.x + x * this.tilewidth,\n\t\t\ttileset.tileoffset.y + (y + 1) * this.tileheight - tileset.tileheight,\n\t\t\ttmxTile,\n\t\t);\n\t}\n\n\t/**\n\t * draw the tile map\n\t * @ignore\n\t */\n\tdrawTileLayer(renderer, layer, rect) {\n\t\tlet incX = 1;\n\t\tlet incY = 1;\n\n\t\t// get top-left and bottom-right tile position\n\t\tconst start = this.pixelToTileCoords(\n\t\t\tMath.max(rect.pos.x - (layer.maxTileSize.width - layer.tilewidth), 0),\n\t\t\tMath.max(rect.pos.y - (layer.maxTileSize.height - layer.tileheight), 0),\n\t\t\tvector2dPool.get(),\n\t\t).floorSelf();\n\n\t\tconst end = this.pixelToTileCoords(\n\t\t\trect.pos.x + rect.width + this.tilewidth,\n\t\t\trect.pos.y + rect.height + this.tileheight,\n\t\t\tvector2dPool.get(),\n\t\t).ceilSelf();\n\n\t\t//ensure we are in the valid tile range\n\t\tend.x = end.x > this.cols ? this.cols : end.x;\n\t\tend.y = end.y > this.rows ? this.rows : end.y;\n\n\t\tswitch (layer.renderorder) {\n\t\t\tcase \"right-up\":\n\t\t\t\t// swapping start.y and end.y\n\t\t\t\tend.y = start.y + (start.y = end.y) - end.y;\n\t\t\t\tincY = -1;\n\t\t\t\tbreak;\n\t\t\tcase \"left-down\":\n\t\t\t\t// swapping start.x and end.x\n\t\t\t\tend.x = start.x + (start.x = end.x) - end.x;\n\t\t\t\tincX = -1;\n\t\t\t\tbreak;\n\t\t\tcase \"left-up\":\n\t\t\t\t// swapping start.x and end.x\n\t\t\t\tend.x = start.x + (start.x = end.x) - end.x;\n\t\t\t\t// swapping start.y and end.y\n\t\t\t\tend.y = start.y + (start.y = end.y) - end.y;\n\t\t\t\tincX = -1;\n\t\t\t\tincY = -1;\n\t\t\t\tbreak;\n\t\t\tdefault: // right-down\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// main drawing loop\n\t\tfor (let y = start.y; y !== end.y; y += incY) {\n\t\t\tfor (let x = start.x; x !== end.x; x += incX) {\n\t\t\t\tconst tmxTile = layer.cellAt(x, y, false);\n\t\t\t\tif (tmxTile) {\n\t\t\t\t\tthis.drawTile(renderer, x, y, tmxTile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvector2dPool.release(start);\n\t\tvector2dPool.release(end);\n\t}\n}\n", "import { degToRad } from \"./../../../math/math.ts\";\nimport { Vector2d, vector2dPool } from \"../../../math/vector2d.ts\";\nimport TMXHexagonalRenderer from \"./TMXHexagonalRenderer.js\";\n\n/**\n * a Staggered Map Renderder\n */\nexport default class TMXStaggeredRenderer extends TMXHexagonalRenderer {\n\t/**\n\t * return true if the renderer can render the specified layer\n\t * @ignore\n\t */\n\tcanRender(layer) {\n\t\treturn layer.orientation === \"staggered\" && super.canRender(layer);\n\t}\n\n\t/**\n\t * return the tile position corresponding to the specified pixel\n\t * @ignore\n\t */\n\tpixelToTileCoords(x, y, v) {\n\t\tlet ret = v || new Vector2d();\n\n\t\tlet alignedX = x;\n\t\tlet alignedY = y;\n\n\t\tif (this.staggerX) {\n\t\t\talignedX -= this.staggerEven ? this.sideoffsetx : 0;\n\t\t} else {\n\t\t\talignedY -= this.staggerEven ? this.sideoffsety : 0;\n\t\t}\n\n\t\t// Start with the coordinates of a grid-aligned tile\n\t\tlet referencePoint = vector2dPool.get(\n\t\t\tMath.floor(alignedX / this.tilewidth),\n\t\t\tMath.floor(alignedY / this.tileheight),\n\t\t);\n\n\t\t// Adjust the reference point to the correct tile coordinates\n\t\tif (this.staggerX) {\n\t\t\treferencePoint.x = referencePoint.x * 2;\n\t\t\tif (this.staggerEven) {\n\t\t\t\t++referencePoint.x;\n\t\t\t}\n\t\t} else {\n\t\t\treferencePoint.y = referencePoint.y * 2;\n\t\t\tif (this.staggerEven) {\n\t\t\t\t++referencePoint.y;\n\t\t\t}\n\t\t}\n\n\t\t// Relative x and y position on the base square of the grid-aligned tile\n\t\tconst rel = vector2dPool.get(\n\t\t\talignedX - referencePoint.x * this.tilewidth,\n\t\t\talignedY - referencePoint.y * this.tileheight,\n\t\t);\n\n\t\t// Check whether the cursor is in any of the corners (neighboring tiles)\n\t\tconst y_pos = rel.x * (this.tileheight / this.tilewidth);\n\n\t\tif (this.sideoffsety - y_pos > rel.y) {\n\t\t\treferencePoint = this.topLeft(\n\t\t\t\treferencePoint.x,\n\t\t\t\treferencePoint.y,\n\t\t\t\treferencePoint,\n\t\t\t);\n\t\t}\n\t\tif (-this.sideoffsety + y_pos > rel.y) {\n\t\t\treferencePoint = this.topRight(\n\t\t\t\treferencePoint.x,\n\t\t\t\treferencePoint.y,\n\t\t\t\treferencePoint,\n\t\t\t);\n\t\t}\n\t\tif (this.sideoffsety + y_pos < rel.y) {\n\t\t\treferencePoint = this.bottomLeft(\n\t\t\t\treferencePoint.x,\n\t\t\t\treferencePoint.y,\n\t\t\t\treferencePoint,\n\t\t\t);\n\t\t}\n\t\tif (this.sideoffsety * 3 - y_pos < rel.y) {\n\t\t\treferencePoint = this.bottomRight(\n\t\t\t\treferencePoint.x,\n\t\t\t\treferencePoint.y,\n\t\t\t\treferencePoint,\n\t\t\t);\n\t\t}\n\n\t\tret = this.tileToPixelCoords(referencePoint.x, referencePoint.y, ret);\n\n\t\tret.set(x - ret.x, y - ret.y);\n\n\t\t// Start with the coordinates of a grid-aligned tile\n\t\tret.set(\n\t\t\tret.x - this.tilewidth / 2,\n\t\t\tret.y * (this.tilewidth / this.tileheight),\n\t\t);\n\n\t\tret\n\t\t\t.div(this.tilewidth / Math.sqrt(2))\n\t\t\t.rotate(degToRad(-45))\n\t\t\t.add(referencePoint);\n\n\t\tvector2dPool.release(referencePoint);\n\t\tvector2dPool.release(rel);\n\n\t\treturn ret;\n\t}\n}\n", "import TMXHexagonalRenderer from \"./TMXHexagonalRenderer.js\";\nimport TMXIsometricRenderer from \"./TMXIsometricRenderer.js\";\nimport TMXOrthogonalRenderer from \"./TMXOrthogonalRenderer.js\";\nimport TMXStaggeredRenderer from \"./TMXStaggeredRenderer.js\";\n\n/**\n * return a compatible renderer object for the given map\n * @param {TMXTileMap} map\n * @ignore\n */\nexport function getNewTMXRenderer(map) {\n\tswitch (map.orientation) {\n\t\tcase \"orthogonal\":\n\t\t\treturn new TMXOrthogonalRenderer(map);\n\n\t\tcase \"isometric\":\n\t\t\treturn new TMXIsometricRenderer(map);\n\n\t\tcase \"hexagonal\":\n\t\t\treturn new TMXHexagonalRenderer(map);\n\n\t\tcase \"staggered\":\n\t\t\treturn new TMXStaggeredRenderer(map);\n\n\t\t// if none found, throw an exception\n\t\tdefault:\n\t\t\tthrow new Error(map.orientation + \" type TMX Tile Map not supported!\");\n\t}\n}\n", "import { ellipsePool } from \"../../geometries/ellipse.ts\";\nimport { linePool } from \"../../geometries/line.ts\";\nimport { pointPool } from \"../../geometries/point.ts\";\nimport { polygonPool } from \"../../geometries/polygon.ts\";\nimport { degToRad } from \"./../../math/math.ts\";\nimport { vector2dPool } from \"../../math/vector2d.ts\";\nimport Tile from \"./TMXTile.js\";\nimport { applyTMXProperties } from \"./TMXUtils.js\";\n\n/**\n * a TMX Object defintion, as defined in Tiled\n * (Object definition is translated into the virtual `me.game.world` using `me.Renderable`)\n * @ignore\n */\nexport default class TMXObject {\n\tconstructor(map, settings, z) {\n\t\t/**\n\t\t * point list in JSON format\n\t\t * @type {object[]}\n\t\t */\n\t\tthis.points = undefined;\n\n\t\t/**\n\t\t * object name\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = settings.name;\n\n\t\t/**\n\t\t * object x position\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = +settings.x;\n\n\t\t/**\n\t\t * object y position\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = +settings.y;\n\n\t\t/**\n\t\t * object z order\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = +z;\n\n\t\t/**\n\t\t * object width\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = +settings.width || 0;\n\n\t\t/**\n\t\t * object height\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = +settings.height || 0;\n\n\t\t/**\n\t\t * object gid value\n\t\t * when defined the object is a tiled object\n\t\t * @type {number}\n\t\t */\n\t\tthis.gid = +settings.gid || null;\n\n\t\t/**\n\t\t * tint color\n\t\t * @type {string}\n\t\t */\n\t\tthis.tintcolor = settings.tintcolor;\n\n\t\t/**\n\t\t * object type\n\t\t * @type {string}\n\t\t * @deprecated since Tiled 1.9\n\t\t * @see {@link https://docs.mapeditor.org/en/stable/reference/tmx-changelog/#tiled-1-9}\n\t\t */\n\t\tthis.type = settings.type;\n\n\t\t/**\n\t\t * the object class\n\t\t * @type {string}\n\t\t */\n\t\tthis.class =\n\t\t\ttypeof settings.class !== \"undefined\" ? settings.class : settings.type;\n\n\t\t/**\n\t\t * object text\n\t\t * @type {object}\n\t\t * @see {@link http://docs.mapeditor.org/en/stable/reference/tmx-map-format/#text}\n\t\t */\n\t\tthis.text = undefined;\n\n\t\t/**\n\t\t * The rotation of the object in radians clockwise (defaults to 0)\n\t\t * @type {number}\n\t\t */\n\t\tthis.rotation = degToRad(+settings.rotation || 0);\n\n\t\t/**\n\t\t * object unique identifier per level (Tiled 0.11.x+)\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = +settings.id || undefined;\n\n\t\t/**\n\t\t * object orientation (orthogonal or isometric)\n\t\t * @type {string}\n\t\t */\n\t\tthis.orientation = map.orientation;\n\n\t\t/**\n\t\t * the collision shapes defined for this object\n\t\t * @type {object[]}\n\t\t */\n\t\tthis.shapes = undefined;\n\n\t\t/**\n\t\t * if true, the object is an Ellipse\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isEllipse = false;\n\n\t\t/**\n\t\t * if true, the object is a Point\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isPoint = false;\n\n\t\t/**\n\t\t * if true, the object is a Polygon\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isPolygon = false;\n\n\t\t/**\n\t\t * if true, the object is a PolyLine\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isPolyLine = false;\n\n\t\t// check if the object has an associated gid\n\t\tif (typeof this.gid === \"number\") {\n\t\t\tthis.setTile(map.tilesets);\n\t\t} else {\n\t\t\tif (typeof settings.ellipse !== \"undefined\") {\n\t\t\t\tthis.isEllipse = true;\n\t\t\t} else if (typeof settings.point !== \"undefined\") {\n\t\t\t\tthis.isPoint = true;\n\t\t\t} else if (typeof settings.polygon !== \"undefined\") {\n\t\t\t\tthis.points = settings.polygon;\n\t\t\t\tthis.isPolygon = true;\n\t\t\t} else if (typeof settings.polyline !== \"undefined\") {\n\t\t\t\tthis.points = settings.polyline;\n\t\t\t\tthis.isPolyLine = true;\n\t\t\t}\n\t\t}\n\n\t\t// check for text information\n\t\tif (typeof settings.text !== \"undefined\") {\n\t\t\t// a text object\n\t\t\tthis.text = settings.text;\n\t\t\t// normalize field name and default value the melonjs way\n\t\t\tthis.text.font = settings.text.fontfamily || \"sans-serif\";\n\t\t\tthis.text.size = settings.text.pixelsize || 16;\n\t\t\tthis.text.fillStyle = settings.text.color || \"#000000\";\n\t\t\tthis.text.textAlign = settings.text.halign || \"left\";\n\t\t\tthis.text.textBaseline = settings.text.valign || \"top\";\n\t\t\tthis.text.width = this.width;\n\t\t\tthis.text.height = this.height;\n\t\t\t// set the object properties\n\t\t\tapplyTMXProperties(this.text, settings);\n\t\t} else {\n\t\t\t// set the object properties\n\t\t\tapplyTMXProperties(this, settings);\n\t\t\t// a standard object\n\t\t\tif (!this.shapes) {\n\t\t\t\t// else define the object shapes if required\n\t\t\t\tthis.shapes = this.parseTMXShapes();\n\t\t\t}\n\t\t}\n\n\t\t// Adjust the Position to match Tiled\n\t\tif (!map.isEditor) {\n\t\t\tmap.getRenderer().adjustPosition(this);\n\t\t}\n\t}\n\n\t/**\n\t * set the object image (for Tiled Object)\n\t * @ignore\n\t */\n\tsetTile(tilesets) {\n\t\t// get the corresponding tileset\n\t\tconst tileset = tilesets.getTilesetByGid(this.gid);\n\n\t\tif (tileset.isCollection === false) {\n\t\t\t// set width and height equal to tile size\n\t\t\tthis.width = this.framewidth = tileset.tilewidth;\n\t\t\tthis.height = this.frameheight = tileset.tileheight;\n\t\t}\n\n\t\t// the object corresponding tile object\n\t\tthis.tile = new Tile(this.x, this.y, this.gid, tileset);\n\t}\n\n\t/**\n\t * parses the TMX shape definition and returns a corresponding array of me.Shape object\n\t * @private\n\t * @returns {Polygon[]|Line[]|Ellipse[]} an array of shape objects\n\t */\n\tparseTMXShapes() {\n\t\tconst shapes = [];\n\n\t\t// add an ellipse shape\n\t\tif (this.isEllipse === true) {\n\t\t\t// ellipse coordinates are the center position, so set default to the corresonding radius\n\t\t\tshapes.push(\n\t\t\t\tellipsePool\n\t\t\t\t\t.get(this.width / 2, this.height / 2, this.width, this.height)\n\t\t\t\t\t.rotate(this.rotation),\n\t\t\t);\n\t\t} else if (this.isPoint === true) {\n\t\t\tshapes.push(pointPool.get(this.x, this.y));\n\t\t} else {\n\t\t\t// add a polygon\n\t\t\tif (this.isPolygon === true) {\n\t\t\t\tconst _polygon = polygonPool.get(0, 0, this.points);\n\t\t\t\tconst isConvex = _polygon.isConvex();\n\t\t\t\t// make sure it's a convex polygon\n\t\t\t\tif (isConvex === false) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"collision polygones in Tiled should be defined as Convex\",\n\t\t\t\t\t);\n\t\t\t\t} else if (isConvex === null) {\n\t\t\t\t\tthrow new Error(\"invalid polygone\");\n\t\t\t\t}\n\t\t\t\tshapes.push(_polygon.rotate(this.rotation));\n\t\t\t} else if (this.isPolyLine === true) {\n\t\t\t\tconst p = this.points;\n\t\t\t\tlet p1;\n\t\t\t\tlet p2;\n\t\t\t\tconst segments = p.length - 1;\n\t\t\t\tfor (let i = 0; i < segments; i++) {\n\t\t\t\t\t// clone the value before, as [i + 1]\n\t\t\t\t\t// is reused later by the next segment\n\t\t\t\t\tp1 = vector2dPool.get(p[i].x, p[i].y);\n\t\t\t\t\tp2 = vector2dPool.get(p[i + 1].x, p[i + 1].y);\n\t\t\t\t\tif (this.rotation !== 0) {\n\t\t\t\t\t\tp1 = p1.rotate(this.rotation);\n\t\t\t\t\t\tp2 = p2.rotate(this.rotation);\n\t\t\t\t\t}\n\t\t\t\t\tshapes.push(linePool.get(0, 0, [p1, p2]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// it's a rectangle, returns a polygon object anyway\n\t\t\telse {\n\t\t\t\tshapes.push(\n\t\t\t\t\tpolygonPool\n\t\t\t\t\t\t.get(0, 0, [\n\t\t\t\t\t\t\tvector2dPool.get(),\n\t\t\t\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t\t\t\t\tvector2dPool.get(0, this.height),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.rotate(this.rotation),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Apply isometric projection\n\t\tif (this.orientation === \"isometric\") {\n\t\t\tfor (let i = 0; i < shapes.length; i++) {\n\t\t\t\tif (typeof shapes[i].toIso === \"function\") {\n\t\t\t\t\tshapes[i].toIso();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn shapes;\n\t}\n\n\t/**\n\t * getObjectPropertyByName\n\t * @ignore\n\t */\n\tgetObjectPropertyByName(name) {\n\t\treturn this[name];\n\t}\n}\n", "import { clamp } from \"./../../math/math.ts\";\nimport TMXLayer from \"./TMXLayer.js\";\nimport TMXObject from \"./TMXObject.js\";\nimport { applyTMXProperties } from \"./TMXUtils.js\";\n\n/**\n * object group definition as defined in Tiled.\n * (group definition is translated into the virtual `me.game.world` using `me.Container`)\n * @ignore\n */\nexport default class TMXGroup {\n\tconstructor(map, data, z) {\n\t\t/**\n\t\t * group name\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = data.name;\n\n\t\t/**\n\t\t * group width\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = data.width || 0;\n\n\t\t/**\n\t\t * group height\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = data.height || 0;\n\n\t\t/**\n\t\t * tint color\n\t\t * @type {string}\n\t\t */\n\t\tthis.tintcolor = data.tintcolor;\n\n\t\t/**\n\t\t * the group class\n\t\t * @type {string}\n\t\t */\n\t\tthis.class = data.class;\n\n\t\t/**\n\t\t * group z order\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * group objects list definition\n\t\t * @see {@link TMXObject}\n\t\t * @type {object[]}\n\t\t */\n\t\tthis.objects = [];\n\n\t\tconst visible = typeof data.visible !== \"undefined\" ? data.visible : true;\n\t\tthis.opacity = visible === true ? clamp(+data.opacity || 1.0, 0.0, 1.0) : 0;\n\n\t\t// check if we have any user-defined properties\n\t\tapplyTMXProperties(this, data);\n\n\t\t// parse all child objects/layers\n\t\tif (data.objects) {\n\t\t\tdata.objects.forEach((object) => {\n\t\t\t\tobject.tintcolor = this.tintcolor;\n\t\t\t\tthis.objects.push(new TMXObject(map, object, z));\n\t\t\t});\n\t\t}\n\n\t\tif (data.layers) {\n\t\t\tdata.layers.forEach((data) => {\n\t\t\t\tconst layer = new TMXLayer(\n\t\t\t\t\tmap,\n\t\t\t\t\tdata,\n\t\t\t\t\tmap.tilewidth,\n\t\t\t\t\tmap.tileheight,\n\t\t\t\t\tmap.orientation,\n\t\t\t\t\tmap.tilesets,\n\t\t\t\t\tz++,\n\t\t\t\t);\n\t\t\t\t// set a renderer\n\t\t\t\tlayer.setRenderer(map.getRenderer());\n\t\t\t\t// resize container accordingly\n\t\t\t\tthis.width = Math.max(this.width, layer.width);\n\t\t\t\tthis.height = Math.max(this.height, layer.height);\n\t\t\t\tthis.objects.push(layer);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * reset function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// clear all allocated objects\n\t\tthis.objects = null;\n\t}\n\n\t/**\n\t * return the object count\n\t * @ignore\n\t */\n\tgetObjectCount() {\n\t\treturn this.objects.length;\n\t}\n\n\t/**\n\t * returns the object at the specified index\n\t * @ignore\n\t */\n\tgetObjectByIndex(idx) {\n\t\treturn this.objects[idx];\n\t}\n}\n", "import { getImage, getTMX } from \"./../../loader/loader.js\";\nimport { Vector2d } from \"../../math/vector2d.ts\";\nimport timer from \"./../../system/timer.ts\";\nimport { getBasename, getExtension } from \"../../utils/file.ts\";\nimport { renderer } from \"./../../video/video.js\";\n\n/**\n * a TMX Tile Set Object\n */\nexport default class TMXTileset {\n\t/**\n\t * @param {object} tileset - tileset data in JSON format ({@link http://docs.mapeditor.org/en/stable/reference/tmx-map-format/#tileset})\n\t */\n\tconstructor(tileset) {\n\t\t// tile properties (collidable, etc..)\n\t\tthis.TileProperties = [];\n\n\t\t// hold reference to each tile image\n\t\tthis.imageCollection = [];\n\n\t\tthis.firstgid = this.lastgid = +tileset.firstgid;\n\n\t\t// check if an external tileset is defined\n\t\tif (typeof tileset.source !== \"undefined\") {\n\t\t\tconst src = tileset.source;\n\t\t\tconst ext = getExtension(src);\n\t\t\tif (ext === \"tsx\" || ext === \"json\") {\n\t\t\t\t// load the external tileset (TSX/JSON)\n\t\t\t\ttileset = getTMX(getBasename(src));\n\t\t\t\tif (!tileset) {\n\t\t\t\t\tthrow new Error(src + \" external TSX/JSON tileset not found\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.name = tileset.name;\n\t\tthis.tilewidth = +tileset.tilewidth;\n\t\tthis.tileheight = +tileset.tileheight;\n\t\tthis.spacing = +tileset.spacing || 0;\n\t\tthis.margin = +tileset.margin || 0;\n\n\t\t// set tile offset properties (if any)\n\t\tthis.tileoffset = new Vector2d();\n\n\t\t/**\n\t\t * Tileset contains animated tiles\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isAnimated = false;\n\n\t\t/**\n\t\t * true if the tileset is a \"Collection of Image\" Tileset\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isCollection = false;\n\n\t\t/**\n\t\t * the tileset class\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.class = tileset.class;\n\n\t\t/**\n\t\t * Tileset animations\n\t\t * @private\n\t\t */\n\t\tthis.animations = new Map();\n\n\t\t/**\n\t\t * Remember the last update timestamp to prevent too many animation updates\n\t\t * @private\n\t\t */\n\t\tthis._lastUpdate = 0;\n\n\t\tconst tiles = tileset.tiles;\n\t\tfor (const i in tiles) {\n\t\t\tif (tiles.hasOwnProperty(i)) {\n\t\t\t\tif (\"animation\" in tiles[i]) {\n\t\t\t\t\tthis.isAnimated = true;\n\t\t\t\t\tthis.animations.set(tiles[+i].animation[0].tileid, {\n\t\t\t\t\t\tdt: 0,\n\t\t\t\t\t\tidx: 0,\n\t\t\t\t\t\tframes: tiles[+i].animation,\n\t\t\t\t\t\tcur: tiles[+i].animation[0],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// set tile properties, if any\n\t\t\t\tif (\"properties\" in tiles[i]) {\n\t\t\t\t\tif (Array.isArray(tiles[i].properties)) {\n\t\t\t\t\t\t// JSON (new format)\n\t\t\t\t\t\tconst tileProperty = {};\n\t\t\t\t\t\tfor (const j in tiles[i].properties) {\n\t\t\t\t\t\t\ttileProperty[tiles[i].properties[j].name] =\n\t\t\t\t\t\t\t\ttiles[i].properties[j].value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.setTileProperty(+tiles[i].id + this.firstgid, tileProperty);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// XML format\n\t\t\t\t\t\tthis.setTileProperty(+i + this.firstgid, tiles[i].properties);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\"image\" in tiles[i]) {\n\t\t\t\t\tconst image = getImage(tiles[i].image);\n\t\t\t\t\tif (!image) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"melonJS: '\" +\n\t\t\t\t\t\t\t\ttiles[i].image +\n\t\t\t\t\t\t\t\t\"' file for tile '\" +\n\t\t\t\t\t\t\t\t(+i + this.firstgid) +\n\t\t\t\t\t\t\t\t\"' not found!\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthis.imageCollection[+i + this.firstgid] = image;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.isCollection = this.imageCollection.length > 0;\n\n\t\tconst offset = tileset.tileoffset;\n\t\tif (offset) {\n\t\t\tthis.tileoffset.x = +offset.x;\n\t\t\tthis.tileoffset.y = +offset.y;\n\t\t}\n\n\t\t// set tile properties, if any (JSON old format)\n\t\tconst tileInfo = tileset.tileproperties;\n\t\tif (tileInfo) {\n\t\t\tfor (const i in tileInfo) {\n\t\t\t\tif (tileInfo.hasOwnProperty(i)) {\n\t\t\t\t\tthis.setTileProperty(+i + this.firstgid, tileInfo[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if not a tile image collection\n\t\tif (this.isCollection === false) {\n\t\t\t// get the global tileset texture\n\t\t\tthis.image = getImage(tileset.image);\n\n\t\t\tif (!this.image) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"melonJS: '\" +\n\t\t\t\t\t\ttileset.image +\n\t\t\t\t\t\t\"' file for tileset '\" +\n\t\t\t\t\t\tthis.name +\n\t\t\t\t\t\t\"' not found!\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// create a texture atlas for the given tileset\n\t\t\tthis.texture = renderer.cache.get(this.image, {\n\t\t\t\tframewidth: this.tilewidth,\n\t\t\t\tframeheight: this.tileheight,\n\t\t\t\tmargin: this.margin,\n\t\t\t\tspacing: this.spacing,\n\t\t\t});\n\t\t\tthis.atlas = this.texture.getAtlas();\n\n\t\t\t// calculate the number of tiles per horizontal line\n\t\t\tconst hTileCount =\n\t\t\t\t+tileset.columns ||\n\t\t\t\tMath.round(this.image.width / (this.tilewidth + this.spacing));\n\t\t\tlet vTileCount = Math.round(\n\t\t\t\tthis.image.height / (this.tileheight + this.spacing),\n\t\t\t);\n\t\t\tif (tileset.tilecount % hTileCount > 0) {\n\t\t\t\t++vTileCount;\n\t\t\t}\n\t\t\t// compute the last gid value in the tileset\n\t\t\tthis.lastgid = this.firstgid + (hTileCount * vTileCount - 1 || 0);\n\t\t\tif (\n\t\t\t\ttileset.tilecount &&\n\t\t\t\tthis.lastgid - this.firstgid + 1 !== +tileset.tilecount\n\t\t\t) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"Computed tilecount (\" +\n\t\t\t\t\t\t(this.lastgid - this.firstgid + 1) +\n\t\t\t\t\t\t\") does not match expected tilecount (\" +\n\t\t\t\t\t\ttileset.tilecount +\n\t\t\t\t\t\t\")\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * return the tile image from a \"Collection of Image\" tileset\n\t * @param {number} gid\n\t * @returns {Image} corresponding image or undefined\n\t */\n\tgetTileImage(gid) {\n\t\treturn this.imageCollection[gid];\n\t}\n\n\t/**\n\t * set the tile properties\n\t * @ignore\n\t */\n\tsetTileProperty(gid, prop) {\n\t\t// set the given tile id\n\t\tthis.TileProperties[gid] = prop;\n\t}\n\n\t/**\n\t * return true if the gid belongs to the tileset\n\t * @param {number} gid\n\t * @returns {boolean}\n\t */\n\tcontains(gid) {\n\t\treturn gid >= this.firstgid && gid <= this.lastgid;\n\t}\n\n\t/**\n\t * Get the view (local) tile ID from a GID, with animations applied\n\t * @param {number} gid - Global tile ID\n\t * @returns {number} View tile ID\n\t */\n\tgetViewTileId(gid) {\n\t\tconst localId = gid - this.firstgid;\n\n\t\tif (this.animations.has(localId)) {\n\t\t\t// return the current corresponding tile id if animated\n\t\t\treturn this.animations.get(localId).cur.tileid;\n\t\t}\n\n\t\treturn localId;\n\t}\n\n\t/**\n\t * return the properties of the specified tile\n\t * @param {number} tileId\n\t * @returns {object}\n\t */\n\tgetTileProperties(tileId) {\n\t\treturn this.TileProperties[tileId];\n\t}\n\n\t// update tile animations\n\tupdate(dt) {\n\t\tlet duration = 0;\n\t\tconst now = timer.getTime();\n\t\tlet result = false;\n\n\t\tif (this._lastUpdate !== now) {\n\t\t\tthis._lastUpdate = now;\n\n\t\t\tthis.animations.forEach((anim) => {\n\t\t\t\tanim.dt += dt;\n\t\t\t\tduration = anim.cur.duration;\n\t\t\t\twhile (anim.dt >= duration) {\n\t\t\t\t\tanim.dt -= duration;\n\t\t\t\t\tanim.idx = (anim.idx + 1) % anim.frames.length;\n\t\t\t\t\tanim.cur = anim.frames[anim.idx];\n\t\t\t\t\tduration = anim.cur.duration;\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// draw the x,y tile\n\tdrawTile(renderer, dx, dy, tmxTile) {\n\t\t// check if any transformation is required\n\t\tif (tmxTile.flipped) {\n\t\t\trenderer.save();\n\t\t\t// apply the tile current transform\n\t\t\trenderer.translate(dx, dy);\n\t\t\trenderer.transform(tmxTile.currentTransform);\n\t\t\t// reset both values as managed through transform();\n\t\t\tdx = dy = 0;\n\t\t}\n\n\t\t// check if the tile has an associated image\n\t\tif (this.isCollection === true) {\n\t\t\t// draw the tile\n\t\t\trenderer.drawImage(\n\t\t\t\tthis.imageCollection[tmxTile.tileId],\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\ttmxTile.width,\n\t\t\t\ttmxTile.height,\n\t\t\t\tdx,\n\t\t\t\tdy,\n\t\t\t\ttmxTile.width,\n\t\t\t\ttmxTile.height,\n\t\t\t);\n\t\t} else {\n\t\t\t// use the tileset texture\n\t\t\tconst offset = this.atlas[this.getViewTileId(tmxTile.tileId)].offset;\n\t\t\t// draw the tile\n\t\t\trenderer.drawImage(\n\t\t\t\tthis.image,\n\t\t\t\toffset.x,\n\t\t\t\toffset.y,\n\t\t\t\tthis.tilewidth,\n\t\t\t\tthis.tileheight,\n\t\t\t\tdx,\n\t\t\t\tdy,\n\t\t\t\tthis.tilewidth + renderer.uvOffset,\n\t\t\t\tthis.tileheight + renderer.uvOffset,\n\t\t\t);\n\t\t}\n\n\t\tif (tmxTile.flipped) {\n\t\t\t// restore the context to the previous state\n\t\t\trenderer.restore();\n\t\t}\n\t}\n}\n", "import { TMX_CLEAR_BIT_MASK } from \"./constants\";\n\n/**\n * an object containing all tileset\n */\nexport default class TMXTilesetGroup {\n\tconstructor() {\n\t\tthis.tilesets = [];\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * add a tileset to the tileset group\n\t * @param {TMXTileset} tileset\n\t */\n\tadd(tileset) {\n\t\tthis.tilesets.push(tileset);\n\t\tthis.length++;\n\t}\n\n\t/**\n\t * return the tileset at the specified index\n\t * @param {number} i\n\t * @returns {TMXTileset} corresponding tileset\n\t */\n\tgetTilesetByIndex(i) {\n\t\treturn this.tilesets[i];\n\t}\n\n\t/**\n\t * return the tileset corresponding to the specified id <br>\n\t * will throw an exception if no matching tileset is found\n\t * @param {number} gid\n\t * @returns {TMXTileset} corresponding tileset\n\t */\n\tgetTilesetByGid(gid) {\n\t\tlet invalidRange = -1;\n\n\t\t// clear the gid of all flip/rotation flags\n\t\tgid &= TMX_CLEAR_BIT_MASK;\n\n\t\t// cycle through all tilesets\n\t\tfor (let i = 0, len = this.tilesets.length; i < len; i++) {\n\t\t\t// return the corresponding tileset if matching\n\t\t\tif (this.tilesets[i].contains(gid)) {\n\t\t\t\treturn this.tilesets[i];\n\t\t\t}\n\t\t\t// typically indicates a layer with no asset loaded (collision?)\n\t\t\tif (\n\t\t\t\tthis.tilesets[i].firstgid === this.tilesets[i].lastgid &&\n\t\t\t\tgid >= this.tilesets[i].firstgid\n\t\t\t) {\n\t\t\t\t// store the id if the [firstgid .. lastgid] is invalid\n\t\t\t\tinvalidRange = i;\n\t\t\t}\n\t\t}\n\t\t// return the tileset with the invalid range\n\t\tif (invalidRange !== -1) {\n\t\t\treturn this.tilesets[invalidRange];\n\t\t} else {\n\t\t\tthrow new Error(\"no matching tileset found for gid \" + gid);\n\t\t}\n\t}\n}\n", "import { polygonPool } from \"../../geometries/polygon.ts\";\nimport { game } from \"../../index.js\";\nimport { warning } from \"../../lang/console.js\";\nimport { colorPool } from \"../../math/color.ts\";\nimport { vector2dPool } from \"../../math/vector2d.ts\";\nimport Body from \"./../../physics/body.js\";\nimport { collision } from \"./../../physics/collision.js\";\nimport Container from \"../../renderable/container.js\";\nimport { eventEmitter, VIEWPORT_ONRESIZE } from \"../../system/event.ts\";\nimport pool from \"../../system/legacy_pool.js\";\nimport { checkVersion } from \"./../../utils/utils.ts\";\nimport { COLLISION_GROUP } from \"./constants.js\";\nimport { getNewTMXRenderer } from \"./renderer/autodetect.js\";\nimport TMXGroup from \"./TMXGroup.js\";\nimport TMXLayer from \"./TMXLayer.js\";\nimport TMXTileset from \"./TMXTileset.js\";\nimport TMXTilesetGroup from \"./TMXTilesetGroup.js\";\nimport { applyTMXProperties } from \"./TMXUtils.js\";\n\n/**\n * read the layer Data\n * @ignore\n */\nfunction readLayer(map, data, z) {\n\treturn new TMXLayer(\n\t\tmap,\n\t\tdata,\n\t\tmap.tilewidth,\n\t\tmap.tileheight,\n\t\tmap.orientation,\n\t\tmap.tilesets,\n\t\tz,\n\t);\n}\n\n/**\n * read the Image Layer Data\n * @ignore\n */\nfunction readImageLayer(map, data, z) {\n\t// Normalize properties\n\tapplyTMXProperties(data.properties, data);\n\n\t// create the layer\n\tconst imageLayer = pool.pull(\n\t\t\"ImageLayer\",\n\t\t// x/y is deprecated since 0.15 and replace by offsetx/y\n\t\t+data.offsetx || +data.x || 0,\n\t\t+data.offsety || +data.y || 0,\n\t\tObject.assign(\n\t\t\t{\n\t\t\t\tname: data.name,\n\t\t\t\timage: data.image,\n\t\t\t\tratio: vector2dPool.get(+data.parallaxx || 1.0, +data.parallaxy || 1.0),\n\t\t\t\t// convert to melonJS color format (note: this should be done earlier when parsing data)\n\t\t\t\ttint:\n\t\t\t\t\ttypeof data.tintcolor !== \"undefined\"\n\t\t\t\t\t\t? colorPool.get().parseHex(data.tintcolor, true)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tz: z,\n\t\t\t},\n\t\t\tdata.properties,\n\t\t),\n\t);\n\n\t// set some additional flags\n\tconst visible = typeof data.visible !== \"undefined\" ? data.visible : true;\n\timageLayer.setOpacity(visible ? +data.opacity : 0);\n\n\treturn imageLayer;\n}\n\n/**\n * read the tileset Data\n * @ignore\n */\nfunction readTileset(data) {\n\treturn new TMXTileset(data);\n}\n\n/**\n * read the object group Data\n * @ignore\n */\nfunction readObjectGroup(map, data, z) {\n\treturn new TMXGroup(map, data, z);\n}\n\n/**\n * a TMX Tile Map Object\n * Tiled QT +0.7.x format\n */\nexport default class TMXTileMap {\n\t/**\n\t * @param {string} levelId - name of TMX map\n\t * @param {object} data - TMX map in JSON format\n\t * @example\n\t * // create a new level object based on the TMX JSON object\n\t * let level = new me.TMXTileMap(levelId, me.loader.getTMX(levelId));\n\t * // add the level to the game world container\n\t * level.addTo(me.game.world, true);\n\t */\n\tconstructor(levelId, data) {\n\t\t/**\n\t\t * the level data (JSON)\n\t\t * @ignore\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * name of the tilemap\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = levelId;\n\n\t\t/**\n\t\t * width of the tilemap in tiles\n\t\t * @type {number}\n\t\t */\n\t\tthis.cols = +data.width;\n\n\t\t/**\n\t\t * height of the tilemap in tiles\n\t\t * @type {number}\n\t\t */\n\t\tthis.rows = +data.height;\n\n\t\t/**\n\t\t * Tile width\n\t\t * @type {number}\n\t\t */\n\t\tthis.tilewidth = +data.tilewidth;\n\n\t\t/**\n\t\t * Tile height\n\t\t * @type {number}\n\t\t */\n\t\tthis.tileheight = +data.tileheight;\n\n\t\t/**\n\t\t * is the map an infinite map\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.infinite = +data.infinite || 0;\n\n\t\t/**\n\t\t * the map orientation type. melonJS supports \u201Corthogonal\u201D, \u201Cisometric\u201D, \u201Cstaggered\u201D and \u201Chexagonal\u201D.\n\t\t * @type {string}\n\t\t * @default \"orthogonal\"\n\t\t */\n\t\tthis.orientation = data.orientation;\n\n\t\t/**\n\t\t * the order in which tiles on orthogonal tile layers are rendered.\n\t\t * (valid values are \"left-down\", \"left-up\", \"right-down\", \"right-up\")\n\t\t * @type {string}\n\t\t * @default \"right-down\"\n\t\t */\n\t\tthis.renderorder = data.renderorder || \"right-down\";\n\n\t\t/**\n\t\t * the TMX format version\n\t\t * @type {string}\n\t\t */\n\t\tthis.version = \"\" + data.version;\n\n\t\t/**\n\t\t * The Tiled version used to save the file (since Tiled 1.0.1).\n\t\t * @type {string}\n\t\t */\n\t\tthis.tiledversion = \"\" + data.tiledversion;\n\n\t\t/**\n\t\t * The map class.\n\t\t * @type {string}\n\t\t */\n\t\tthis.class = data.class;\n\n\t\t// tilesets for this map\n\t\tthis.tilesets = null;\n\n\t\t// layers\n\t\tif (typeof this.layers === \"undefined\") {\n\t\t\tthis.layers = [];\n\t\t}\n\t\t// group objects\n\t\tif (typeof this.objectGroups === \"undefined\") {\n\t\t\tthis.objectGroups = [];\n\t\t}\n\n\t\t// Check if map is from melon editor\n\t\tthis.isEditor = data.editor === \"melon-editor\";\n\n\t\t// object id\n\t\tthis.nextobjectid = +data.nextobjectid || undefined;\n\n\t\t// hex/iso properties\n\t\tthis.hexsidelength = +data.hexsidelength;\n\t\tthis.staggeraxis = data.staggeraxis;\n\t\tthis.staggerindex = data.staggerindex;\n\n\t\t// calculate the map bounding rect\n\t\tthis.bounds = this.getRenderer().getBounds().clone();\n\n\t\t// map \"real\" size\n\t\tthis.width = this.bounds.width;\n\t\tthis.height = this.bounds.height;\n\n\t\t// background color\n\t\tthis.backgroundcolor = data.backgroundcolor;\n\n\t\t// if version is undefined or empty it usually means the map was not created with Tiled\n\t\tif (this.version !== \"undefined\" && this.version !== \"\") {\n\t\t\t// deprecation warning if map tiled version is older than 1.5\n\t\t\tif (checkVersion(this.version, \"1.5\") < 0) {\n\t\t\t\twarning(\n\t\t\t\t\t\"(\" + this.name + \") Tiled Map format version 1.4 and below\",\n\t\t\t\t\t\"format 1.5 or higher\",\n\t\t\t\t\t\"10.4.4\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// set additional map properties (if any)\n\t\tapplyTMXProperties(this, data);\n\n\t\t// internal flag\n\t\tthis.initialized = false;\n\t}\n\n\t/**\n\t * Return the map default renderer\n\t * @returns {TMXRenderer} a TMX renderer\n\t */\n\tgetRenderer() {\n\t\tif (\n\t\t\ttypeof this.renderer === \"undefined\" ||\n\t\t\t!this.renderer.canRender(this)\n\t\t) {\n\t\t\tthis.renderer = getNewTMXRenderer(this);\n\t\t}\n\t\treturn this.renderer;\n\t}\n\n\t/**\n\t * return the map bounding rect\n\t * @returns {Bounds}\n\t */\n\tgetBounds() {\n\t\t// calculated in the constructor\n\t\treturn this.bounds;\n\t}\n\n\t/**\n\t * parse the map\n\t * @ignore\n\t */\n\treadMapObjects(data) {\n\t\tif (this.initialized === true) {\n\t\t\treturn;\n\t\t}\n\n\t\t// to automatically increment z index\n\t\tlet zOrder = 0;\n\n\t\t// Tileset information\n\t\tif (!this.tilesets) {\n\t\t\t// make sure we have a TilesetGroup Object\n\t\t\tthis.tilesets = new TMXTilesetGroup();\n\t\t}\n\n\t\t// parse all tileset objects\n\t\tif (typeof data.tilesets !== \"undefined\") {\n\t\t\tconst tilesets = data.tilesets;\n\t\t\ttilesets.forEach((tileset) => {\n\t\t\t\t// add the new tileset\n\t\t\t\tthis.tilesets.add(readTileset(tileset));\n\t\t\t});\n\t\t}\n\n\t\t// check if a background image is defined\n\t\tif (this.background_image) {\n\t\t\t// add a new image layer\n\t\t\tthis.layers.push(\n\t\t\t\tpool.pull(\"ImageLayer\", 0, 0, {\n\t\t\t\t\tname: \"background_image\",\n\t\t\t\t\timage: this.background_image,\n\t\t\t\t\tz: zOrder++,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tdata.layers.forEach((layer) => {\n\t\t\tswitch (layer.type) {\n\t\t\t\tcase \"imagelayer\":\n\t\t\t\t\tthis.layers.push(readImageLayer(this, layer, zOrder++));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"tilelayer\":\n\t\t\t\t\tthis.layers.push(readLayer(this, layer, zOrder++));\n\t\t\t\t\tbreak;\n\n\t\t\t\t// get the object groups information\n\t\t\t\tcase \"objectgroup\":\n\t\t\t\t\tthis.objectGroups.push(readObjectGroup(this, layer, zOrder++));\n\t\t\t\t\tbreak;\n\n\t\t\t\t// get the object groups information\n\t\t\t\tcase \"group\":\n\t\t\t\t\tthis.objectGroups.push(readObjectGroup(this, layer, zOrder++));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\tthis.initialized = true;\n\t}\n\n\t/**\n\t * add all the map layers and objects to the given container.\n\t * note : this will not automatically update the camera viewport\n\t * @param {Container} container - target container\n\t * @param {boolean} [flatten=true] - if true, flatten all objects into the given container, else a `me.Container` object will be created for each corresponding groups\n\t * @param {boolean} [setViewportBounds=false] - if true, set the viewport bounds to the map size, this should be set to true especially if adding a level to the game world container.\n\t * @example\n\t * // create a new level object based on the TMX JSON object\n\t * let level = new me.TMXTileMap(levelId, me.loader.getTMX(levelId));\n\t * // add the level to the game world container\n\t * level.addTo(me.game.world, true, true);\n\t */\n\taddTo(container, flatten, setViewportBounds) {\n\t\tconst _sort = container.autoSort;\n\t\tconst _depth = container.autoDepth;\n\n\t\tconst levelBounds = this.getBounds();\n\n\t\t// disable auto-sort and auto-depth\n\t\tcontainer.autoSort = false;\n\t\tcontainer.autoDepth = false;\n\n\t\tif (this.backgroundcolor) {\n\t\t\tcontainer.backgroundColor.parseCSS(this.backgroundcolor);\n\t\t}\n\n\t\t// add all layers instances\n\t\tthis.getLayers().forEach((layer) => {\n\t\t\tcontainer.addChild(layer);\n\t\t});\n\n\t\t// add all Object instances\n\t\tthis.getObjects(flatten).forEach((object) => {\n\t\t\tcontainer.addChild(object);\n\t\t});\n\n\t\t// resize the container accordingly\n\t\tcontainer.resize(this.bounds.width, this.bounds.height);\n\n\t\t// sort everything (recursively)\n\t\tcontainer.sort(true);\n\n\t\t/**\n\t\t * callback funtion for the viewport resize event\n\t\t * @ignore\n\t\t */\n\t\tfunction _setBounds(width, height) {\n\t\t\t// adjust the viewport bounds if level is smaller\n\t\t\tgame.viewport.setBounds(\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tMath.max(levelBounds.width, width),\n\t\t\t\tMath.max(levelBounds.height, height),\n\t\t\t);\n\t\t\t// center the map if smaller than the current viewport\n\t\t\tcontainer.pos.set(\n\t\t\t\tMath.max(0, ~~((width - levelBounds.width) / 2)),\n\t\t\t\tMath.max(0, ~~((height - levelBounds.height) / 2)),\n\t\t\t\t// don't change the container z position if defined\n\t\t\t\tcontainer.pos.z,\n\t\t\t);\n\t\t}\n\n\t\tif (setViewportBounds === true) {\n\t\t\teventEmitter.removeListener(VIEWPORT_ONRESIZE, _setBounds);\n\t\t\t// force viewport bounds update\n\t\t\t_setBounds(game.viewport.width, game.viewport.height);\n\t\t\t// Replace the resize handler\n\t\t\teventEmitter.addListener(VIEWPORT_ONRESIZE, _setBounds);\n\t\t}\n\n\t\t// set back auto-sort and auto-depth\n\t\tcontainer.autoSort = _sort;\n\t\tcontainer.autoDepth = _depth;\n\t}\n\n\t/**\n\t * return an Array of instantiated objects, based on the map object definition\n\t * @param {boolean} [flatten=true] - if true, flatten all objects into the returned array.\n\t * when false, a `me.Container` object will be created for each corresponding groups\n\t * @returns {Renderable[]} Array of Objects\n\t */\n\tgetObjects(flatten) {\n\t\tconst objects = [];\n\t\tlet isCollisionGroup = false;\n\t\tlet targetContainer;\n\n\t\t// parse the map for objects\n\t\tthis.readMapObjects(this.data);\n\n\t\tfor (let g = 0; g < this.objectGroups.length; g++) {\n\t\t\tconst group = this.objectGroups[g];\n\n\t\t\t// check if this is the collision shape group\n\t\t\tisCollisionGroup = group.name.toLowerCase().includes(COLLISION_GROUP);\n\n\t\t\tif (flatten === false) {\n\t\t\t\t// create a new container\n\t\t\t\ttargetContainer = new Container(0, 0, this.width, this.height);\n\n\t\t\t\t// tiled uses 0,0 by default\n\t\t\t\ttargetContainer.anchorPoint.set(0, 0);\n\n\t\t\t\t// set additional properties\n\t\t\t\ttargetContainer.name = group.name;\n\t\t\t\ttargetContainer.pos.z = group.z;\n\t\t\t\ttargetContainer.setOpacity(group.opacity);\n\n\t\t\t\t// disable auto-sort and auto-depth\n\t\t\t\ttargetContainer.autoSort = false;\n\t\t\t\ttargetContainer.autoDepth = false;\n\t\t\t}\n\n\t\t\t// iterate through the group and add all object into their\n\t\t\t// corresponding target Container\n\t\t\tfor (let o = 0; o < group.objects.length; o++) {\n\t\t\t\t// TMX object settings\n\t\t\t\tconst settings = group.objects[o];\n\t\t\t\t// reference to the instantiated object\n\t\t\t\tlet obj;\n\t\t\t\t// a reference to the default shape\n\t\t\t\tlet shape;\n\n\t\t\t\t// Tiled uses 0,0 by default\n\t\t\t\tif (typeof settings.anchorPoint === \"undefined\") {\n\t\t\t\t\tsettings.anchorPoint = { x: 0, y: 0 };\n\t\t\t\t}\n\t\t\t\t// convert to melonJS renderable argument name\n\t\t\t\tif (typeof settings.tintcolor !== \"undefined\") {\n\t\t\t\t\tsettings.tint = colorPool.get();\n\t\t\t\t\tsettings.tint.parseHex(settings.tintcolor, true);\n\t\t\t\t}\n\n\t\t\t\t/// XXX Clean/rewrite all this part to remove object\n\t\t\t\t/// specific instantiation logic/details from here\n\n\t\t\t\t// groups can contains either text, objects or layers\n\t\t\t\tif (settings instanceof TMXLayer) {\n\t\t\t\t\t// layers are already instantiated & initialized\n\t\t\t\t\tobj = settings;\n\t\t\t\t\t// z value set already\n\t\t\t\t} else if (typeof settings.text === \"object\") {\n\t\t\t\t\t// Tiled uses 0,0 by default\n\t\t\t\t\tif (typeof settings.text.anchorPoint === \"undefined\") {\n\t\t\t\t\t\tsettings.text.anchorPoint = settings.anchorPoint;\n\t\t\t\t\t}\n\t\t\t\t\tif (settings.text.bitmap === true) {\n\t\t\t\t\t\tobj = pool.pull(\n\t\t\t\t\t\t\t\"BitmapText\",\n\t\t\t\t\t\t\tsettings.x,\n\t\t\t\t\t\t\tsettings.y,\n\t\t\t\t\t\t\tsettings.text,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobj = pool.pull(\"Text\", settings.x, settings.y, settings.text);\n\t\t\t\t\t}\n\t\t\t\t\t// set the obj z order\n\t\t\t\t\tobj.pos.z = settings.z;\n\t\t\t\t} else if (typeof settings.tile === \"object\") {\n\t\t\t\t\t// create a default shape if none is specified\n\t\t\t\t\tshape = settings.shapes;\n\t\t\t\t\tif (typeof shape === \"undefined\") {\n\t\t\t\t\t\tshape = polygonPool.get(0, 0, [\n\t\t\t\t\t\t\tvector2dPool.get(0, 0),\n\t\t\t\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t\t// check if a me.Tile object is embedded\n\t\t\t\t\tobj = settings.tile.getRenderable(settings);\n\t\t\t\t\tobj.body = new Body(obj, shape);\n\t\t\t\t\tobj.body.setStatic(true);\n\t\t\t\t\t// set the obj z order\n\t\t\t\t\tobj.pos.setMuted(settings.x, settings.y, settings.z);\n\t\t\t\t} else {\n\t\t\t\t\t// pull the corresponding object from the object pool\n\t\t\t\t\tif (typeof settings.name !== \"undefined\" && settings.name !== \"\") {\n\t\t\t\t\t\tobj = pool.pull(settings.name, settings.x, settings.y, settings);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// unnamed shape object\n\t\t\t\t\t\tobj = pool.pull(\n\t\t\t\t\t\t\t\"Renderable\",\n\t\t\t\t\t\t\tsettings.x,\n\t\t\t\t\t\t\tsettings.y,\n\t\t\t\t\t\t\tsettings.width,\n\t\t\t\t\t\t\tsettings.height,\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// create a default shape if none is specified\n\t\t\t\t\t\tshape = settings.shapes;\n\t\t\t\t\t\tif (typeof shape === \"undefined\") {\n\t\t\t\t\t\t\tshape = polygonPool.get(0, 0, [\n\t\t\t\t\t\t\t\tvector2dPool.get(0, 0),\n\t\t\t\t\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\t\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tobj.anchorPoint.set(0, 0);\n\t\t\t\t\t\tobj.name = settings.name;\n\t\t\t\t\t\tobj.type = settings.type;\n\t\t\t\t\t\t// for backward compatibility\n\t\t\t\t\t\tobj.class = settings.class || settings.type;\n\t\t\t\t\t\tobj.id = settings.id;\n\t\t\t\t\t\tobj.body = new Body(obj, shape);\n\t\t\t\t\t\tobj.body.setStatic(true);\n\t\t\t\t\t\tobj.resize(obj.body.getBounds().width, obj.body.getBounds().height);\n\t\t\t\t\t}\n\t\t\t\t\t// set the obj z order\n\t\t\t\t\tobj.pos.z = settings.z;\n\t\t\t\t}\n\n\t\t\t\tif (isCollisionGroup && !settings.name && obj.body) {\n\t\t\t\t\t// configure the body accordingly\n\t\t\t\t\tobj.body.collisionType = collision.types.WORLD_SHAPE;\n\t\t\t\t\t// mark collision shapes as static\n\t\t\t\t\tobj.body.isStatic = true;\n\t\t\t\t}\n\n\t\t\t\t//apply group opacity value to the child objects if group are merged\n\t\t\t\tif (flatten !== false) {\n\t\t\t\t\tif (obj.isRenderable === true) {\n\t\t\t\t\t\tobj.setOpacity(obj.getOpacity() * group.opacity);\n\t\t\t\t\t\t// and to child renderables if any\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttypeof obj.renderable !== \"undefined\" &&\n\t\t\t\t\t\t\tobj.renderable.isRenderable === true\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tobj.renderable.setOpacity(\n\t\t\t\t\t\t\t\tobj.renderable.getOpacity() * group.opacity,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// directly add the obj into the objects array\n\t\t\t\t\tobjects.push(obj);\n\t\t\t\t} /* false*/ else {\n\t\t\t\t\t// add it to the new container\n\t\t\t\t\ttargetContainer.addChild(obj);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if we created a new container\n\t\t\tif (flatten === false && targetContainer.children.length > 0) {\n\t\t\t\t// re-enable auto-sort and auto-depth\n\t\t\t\ttargetContainer.autoSort = true;\n\t\t\t\ttargetContainer.autoDepth = true;\n\n\t\t\t\t// add our container to the world\n\t\t\t\tobjects.push(targetContainer);\n\t\t\t}\n\t\t}\n\t\treturn objects;\n\t}\n\n\t/**\n\t * return all the existing layers\n\t * @returns {TMXLayer[]} Array of Layers\n\t */\n\tgetLayers() {\n\t\t// parse the map for objects\n\t\tthis.readMapObjects(this.data);\n\t\treturn this.layers;\n\t}\n\n\t/**\n\t * destroy function, clean all allocated objects\n\t */\n\tdestroy() {\n\t\tthis.tilesets = undefined;\n\t\tthis.layers.length = 0;\n\t\tthis.objectGroups.length = 0;\n\t\tthis.initialized = false;\n\t}\n}\n", "import { game } from \"../index.js\";\nimport { getTMX } from \"./../loader/loader.js\";\nimport state from \"./../state/state.js\";\nimport { eventEmitter, LEVEL_LOADED } from \"../system/event.ts\";\nimport { resetGUID } from \"./../utils/utils.ts\";\nimport TMXTileMap from \"./tiled/TMXTileMap.js\";\n\n// our levels\nconst levels = {};\n// level index table\nconst levelIdx = [];\n// current level index\nlet currentLevelIdx = 0;\n\n/**\n * @ignore\n */\nfunction safeLoadLevel(levelId, options, restart) {\n\t// clean the destination container\n\toptions.container.reset();\n\n\t// reset the renderer\n\tgame.reset();\n\n\t// clean the current (previous) level\n\tif (levels[level.getCurrentLevelId()]) {\n\t\tlevels[level.getCurrentLevelId()].destroy();\n\t}\n\n\t// update current level index\n\tcurrentLevelIdx = levelIdx.indexOf(levelId);\n\n\t// add the specified level to the game world\n\tloadTMXLevel(\n\t\tlevelId,\n\t\toptions.container,\n\t\toptions.flatten,\n\t\toptions.setViewportBounds,\n\t);\n\n\t// publish the corresponding message\n\teventEmitter.emit(LEVEL_LOADED, levelId);\n\n\t// fire the callback\n\toptions.onLoaded(levelId);\n\n\tif (restart) {\n\t\t// resume the game loop if it was previously running\n\t\tstate.restart();\n\t}\n}\n\n/**\n * Load a TMX level\n * @name loadTMXLevel\n * @memberof level\n * @private\n * @param {string} levelId - level id\n * @param {Container} container - target container\n * @param {boolean} [flatten=true] - if true, flatten all objects into the given container\n * @param {boolean} [setViewportBounds=false] - if true, set the viewport bounds to the map size, this should be set to true especially if adding a level to the game world container.\n * @ignore\n */\nfunction loadTMXLevel(levelId, container, flatten, setViewportBounds) {\n\tconst level = levels[levelId];\n\t// reset the GUID generator\n\t// and pass the level id as parameter\n\tresetGUID(levelId, level.nextobjectid);\n\n\t// Tiled use 0,0 anchor coordinates\n\tcontainer.anchorPoint.set(0, 0);\n\n\t// add all level elements to the target container\n\tlevel.addTo(container, flatten, setViewportBounds);\n}\n\n/**\n * a level manager. once ressources loaded, the level manager contains all references of defined levels.\n * @namespace level\n */\n\nexport const level = {\n\t/**\n\t * add a level into the game manager (usually called by the preloader)\n\t * @name add\n\t * @memberof level\n\t * @public\n\t * @param {string} format - level format (only \"tmx\" supported)\n\t * @param {string} levelId - the level id (or name)\n\t * @param {Function} [callback] - a function to be called once the level is loaded\n\t * @returns {boolean} true if the level was loaded\n\t */\n\tadd(format, levelId, callback) {\n\t\tswitch (format) {\n\t\t\tcase \"tmx\":\n\t\t\t\t// just load the level with the XML stuff\n\t\t\t\tif (levels[levelId] == null) {\n\t\t\t\t\t//console.log(\"loading \"+ levelId);\n\t\t\t\t\tlevels[levelId] = new TMXTileMap(levelId, getTMX(levelId));\n\t\t\t\t\t// level index\n\t\t\t\t\tlevelIdx.push(levelId);\n\t\t\t\t} else {\n\t\t\t\t\t//console.log(\"level %s already loaded\", levelId);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// call the callback if defined\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t\t// true if level loaded\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"no level loader defined for format \" + format);\n\t\t}\n\t},\n\n\t/**\n\t * load a level into the game manager<br>\n\t * (will also create all level defined entities, etc..)\n\t * @name load\n\t * @memberof level\n\t * @public\n\t * @param {string} levelId - level id\n\t * @param {object} [options] - additional optional parameters\n\t * @param {Container} [options.container=game.world] - container in which to load the specified level\n\t * @param {Function} [options.onLoaded=game.onLevelLoaded] - callback for when the level is fully loaded\n\t * @param {boolean} [options.flatten=game.mergeGroup] - if true, flatten all objects into the given container\n\t * @param {boolean} [options.setViewportBounds=true] - if true, set the viewport bounds to the map size\n\t * @returns {boolean} true if the level was successfully loaded\n\t * @example\n\t * // the game assets to be be preloaded\n\t * // TMX maps\n\t * let resources = [\n\t * {name: \"a4_level1\", type: \"tmx\", src: \"data/level/a4_level1.tmx\"},\n\t * {name: \"a4_level2\", type: \"tmx\", src: \"data/level/a4_level2.tmx\"},\n\t * {name: \"a4_level3\", type: \"tmx\", src: \"data/level/a4_level3.tmx\"},\n\t * // ...\n\t * ];\n\t *\n\t * // ...\n\t *\n\t * // load a level into the game world\n\t * me.level.load(\"a4_level1\");\n\t * ...\n\t * ...\n\t * // load a level into a specific container\n\t * let levelContainer = new me.Container();\n\t * me.level.load(\"a4_level2\", {container:levelContainer});\n\t * // add a simple transformation\n\t * levelContainer.currentTransform.translate(levelContainer.width / 2, levelContainer.height / 2 );\n\t * levelContainer.currentTransform.rotate(0.05);\n\t * levelContainer.currentTransform.translate(-levelContainer.width / 2, -levelContainer.height / 2 );\n\t * // add it to the game world\n\t * me.game.world.addChild(levelContainer);\n\t */\n\tload(levelId, options) {\n\t\toptions = Object.assign(\n\t\t\t{\n\t\t\t\tcontainer: game.world,\n\t\t\t\tonLoaded: game.onLevelLoaded,\n\t\t\t\tflatten: game.mergeGroup,\n\t\t\t\tsetViewportBounds: true,\n\t\t\t},\n\t\t\toptions || {},\n\t\t);\n\n\t\t// throw an exception if not existing\n\t\tif (typeof levels[levelId] === \"undefined\") {\n\t\t\tthrow new Error(\"level \" + levelId + \" not found\");\n\t\t}\n\n\t\tif (levels[levelId] instanceof TMXTileMap) {\n\t\t\t// check the status of the state mngr\n\t\t\tconst wasRunning = state.isRunning();\n\n\t\t\tif (wasRunning) {\n\t\t\t\t// stop the game loop to avoid\n\t\t\t\t// some silly side effects\n\t\t\t\tstate.stop();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsafeLoadLevel(levelId, options, true);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsafeLoadLevel(levelId, options);\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"no level loader defined\");\n\t\t}\n\t\treturn true;\n\t},\n\n\t/**\n\t * return the current level id<br>\n\t * @name getCurrentLevelId\n\t * @memberof level\n\t * @public\n\t * @returns {string}\n\t */\n\tgetCurrentLevelId() {\n\t\treturn levelIdx[currentLevelIdx];\n\t},\n\n\t/**\n\t * return the current level definition.\n\t * for a reference to the live instantiated level,\n\t * rather use the container in which it was loaded (e.g. me.game.world)\n\t * @name getCurrentLevel\n\t * @memberof level\n\t * @public\n\t * @returns {TMXTileMap}\n\t */\n\tgetCurrentLevel() {\n\t\treturn levels[this.getCurrentLevelId()];\n\t},\n\n\t/**\n\t * reload the current level\n\t * @name reload\n\t * @memberof level\n\t * @public\n\t * @param {object} [options] - additional optional parameters\n\t * @param {Container} [options.container=game.world] - container in which to load the specified level\n\t * @param {Function} [options.onLoaded=game.onLevelLoaded] - callback for when the level is fully loaded\n\t * @param {boolean} [options.flatten=game.mergeGroup] - if true, flatten all objects into the given container\n\t * @returns {object} the current level\n\t */\n\treload(options) {\n\t\t// reset the level to initial state\n\t\t//levels[currentLevel].reset();\n\t\treturn this.load(this.getCurrentLevelId(), options);\n\t},\n\n\t/**\n\t * load the next level\n\t * @name next\n\t * @memberof level\n\t * @public\n\t * @param {object} [options] - additional optional parameters\n\t * @param {Container} [options.container=game.world] - container in which to load the specified level\n\t * @param {Function} [options.onLoaded=game.onLevelLoaded] - callback for when the level is fully loaded\n\t * @param {boolean} [options.flatten=game.mergeGroup] - if true, flatten all objects into the given container\n\t * @returns {boolean} true if the next level was successfully loaded\n\t */\n\tnext(options) {\n\t\t//go to the next level\n\t\tif (currentLevelIdx + 1 < levelIdx.length) {\n\t\t\treturn this.load(levelIdx[currentLevelIdx + 1], options);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t/**\n\t * load the previous level<br>\n\t * @name previous\n\t * @memberof level\n\t * @public\n\t * @param {object} [options] - additional optional parameters\n\t * @param {Container} [options.container=game.world] - container in which to load the specified level\n\t * @param {Function} [options.onLoaded=game.onLevelLoaded] - callback for when the level is fully loaded\n\t * @param {boolean} [options.flatten=game.mergeGroup] - if true, flatten all objects into the given container\n\t * @returns {boolean} true if the previous level was successfully loaded\n\t */\n\tprevious(options) {\n\t\t// go to previous level\n\t\tif (currentLevelIdx - 1 >= 0) {\n\t\t\treturn this.load(levelIdx[currentLevelIdx - 1], options);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t/**\n\t * return the amount of level preloaded\n\t * @name levelCount\n\t * @memberof level\n\t * @public\n\t * @returns {number} the amount of level preloaded\n\t */\n\tlevelCount() {\n\t\treturn levelIdx.length;\n\t},\n};\n", "import { level } from \"../../level/level.js\";\nimport * as TMXUtils from \"../../level/tiled/TMXUtils.js\";\nimport { getExtension } from \"../../utils/file.ts\";\nimport { tmxList } from \"../cache.js\";\nimport { fetchData } from \"./fetchdata.js\";\n\n/**\n * parse/preload a TMX file\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the asset is loaded\n * @param {Function} [onload] - function to be called when the resource is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n */\nexport function preloadTMX(tmxData, onload, onerror, settings) {\n\tif (typeof tmxList[tmxData.name] !== \"undefined\") {\n\t\t// already loaded\n\t\treturn 0;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tfunction addToTMXList(data) {\n\t\t// set the TMX content\n\t\ttmxList[tmxData.name] = data;\n\n\t\t// add the tmx to the level manager\n\t\tif (tmxData.type === \"tmx\") {\n\t\t\tlevel.add(tmxData.type, tmxData.name);\n\t\t}\n\t}\n\n\t//if the data is in the tmxData object, don't get it via a XMLHTTPRequest\n\tif (tmxData.data) {\n\t\taddToTMXList(tmxData.data);\n\t\tif (typeof onload === \"function\") {\n\t\t\tonload();\n\t\t}\n\t\treturn;\n\t}\n\n\tfetchData(tmxData.src, \"text\", settings)\n\t\t.then((response) => {\n\t\t\tif (typeof response !== \"string\") {\n\t\t\t\tthrow new Error(\"Invalid response type\");\n\t\t\t}\n\n\t\t\tlet result;\n\n\t\t\tswitch (getExtension(tmxData.src)) {\n\t\t\t\tcase \"xml\":\n\t\t\t\tcase \"tmx\":\n\t\t\t\tcase \"tsx\": {\n\t\t\t\t\tconst parser = new DOMParser();\n\n\t\t\t\t\tif (typeof parser.parseFromString === \"undefined\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"XML file format loading supported, use the JSON file format instead\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst xmlDoc = parser.parseFromString(response, \"text/xml\");\n\t\t\t\t\tconst data = TMXUtils.parse(xmlDoc);\n\n\t\t\t\t\tresult = data.map || data.tilesets[0] || data;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"json\":\n\t\t\t\tcase \"tmj\":\n\t\t\t\tcase \"tsj\":\n\t\t\t\t\tresult = JSON.parse(response);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`TMX file format not supported: ${getExtension(tmxData.src)}`,\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\taddToTMXList(result);\n\n\t\t\tif (typeof onload === \"function\") {\n\t\t\t\tonload();\n\t\t\t}\n\t\t})\n\t\t.catch((error) => {\n\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\tonerror(error);\n\t\t\t}\n\t\t});\n\n\treturn 1;\n}\n", "import { hasVideoFormat } from \"../../system/device.js\";\nimport * as fileUtil from \"../../utils/file.ts\";\nimport { isDataUrl } from \"./../../utils/string.ts\";\nimport { videoList } from \"../cache.js\";\nimport { fetchData } from \"./fetchdata.js\";\n\n/**\n * parse/preload a Video file\n * @param {loader.Asset} data - asset data\n * @param {Function} [onload] - function to be called when the resource is loaded\n * @param {Function} [onerror] - function to be called in case of error\n * @param {Object} [settings] - Additional settings to be passed when loading the asset\n * @returns {number} the amount of corresponding resource parsed/preloaded\n * @ignore\n */\nexport function preloadVideo(data, onload, onerror, settings) {\n\tif (typeof videoList[data.name] !== \"undefined\") {\n\t\t// Video already preloaded\n\t\treturn 0;\n\t}\n\n\tconst videoElement = (videoList[data.name] =\n\t\tglobalThis.document.createElement(\"video\"));\n\n\tif (isDataUrl(data.src)) {\n\t\tconst mimeType = data.src.match(/[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/)[0];\n\t\tif (!mimeType || videoElement.canPlayType(mimeType) === \"\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid dataURL or Video file format not supported: ${mimeType}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (!hasVideoFormat(fileUtil.getExtension(data.src))) {\n\t\t\tthrow new Error(\n\t\t\t\t`Video file format not supported: ${fileUtil.getExtension(data.src)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (isDataUrl(data.src)) {\n\t\tfetchData(data.src, \"blob\", settings)\n\t\t\t.then((blob) => {\n\t\t\t\tvideoElement.src = globalThis.URL.createObjectURL(blob);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (typeof onerror === \"function\") {\n\t\t\t\t\tonerror(error);\n\t\t\t\t}\n\t\t\t});\n\t} else {\n\t\t// just a url path\n\t\tvideoElement.src = data.src;\n\t}\n\n\tvideoElement.setAttribute(\n\t\t\"preload\",\n\t\tdata.stream === true ? \"metadata\" : \"auto\",\n\t);\n\tvideoElement.setAttribute(\"playsinline\", \"true\");\n\tvideoElement.setAttribute(\"disablePictureInPicture\", \"true\");\n\tvideoElement.setAttribute(\"controls\", \"false\");\n\tvideoElement.setAttribute(\"crossorigin\", settings.crossOrigin);\n\n\tif (data.autoplay === true) {\n\t\tvideoElement.setAttribute(\"autoplay\", \"true\");\n\t}\n\tif (data.loop === true) {\n\t\tvideoElement.setAttribute(\"loop\", \"true\");\n\t}\n\n\tif (typeof onload === \"function\") {\n\t\t// some mobile browser (e.g. safari) won't emit the canplay event if autoplay is disabled\n\t\tif (data.stream === true || data.autoplay === false) {\n\t\t\tvideoElement.onloadedmetadata = () => {\n\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\tonload();\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tvideoElement.oncanplay = () => {\n\t\t\t\tif (typeof onload === \"function\") {\n\t\t\t\t\tonload();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\n\tif (typeof onerror === \"function\") {\n\t\tvideoElement.onerror = () => {\n\t\t\tonerror();\n\t\t};\n\t}\n\n\tvideoElement.load();\n\n\treturn 1;\n}\n", "import { getImage } from \"./../loader/loader.js\";\nimport { Color } from \"../math/color.ts\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport { eventEmitter } from \"../system/event.ts\";\nimport { TextureAtlas } from \"./../video/texture/atlas.js\";\nimport { renderer } from \"./../video/video.js\";\nimport Renderable from \"./renderable.js\";\n\n/**\n * additional import for TypeScript\n * @import {Vector2d} from \"../math/vector2d.js\";\n * @import CanvasRenderer from \"./../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n */\n\n/**\n * An object to display a fixed or animated sprite on screen.\n */\nexport default class Sprite extends Renderable {\n\t/**\n\t * @param {number} x - the x coordinates of the sprite object\n\t * @param {number} y - the y coordinates of the sprite object\n\t * @param {object} settings - Configuration parameters for the Sprite object\n\t * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|TextureAtlas|string} settings.image - reference to spritesheet image, a texture atlas, a video element, or to a texture atlas\n\t * @param {string} [settings.name=\"\"] - name of this object\n\t * @param {string} [settings.region] - region name of a specific region to use when using a texture atlas, see {@link TextureAtlas}\n\t * @param {number} [settings.framewidth] - Width of a single frame within the spritesheet\n\t * @param {number} [settings.frameheight] - Height of a single frame within the spritesheet\n\t * @param {string|Color} [settings.tint] - a tint to be applied to this sprite\n\t * @param {number} [settings.flipX] - flip the sprite on the horizontal axis\n\t * @param {number} [settings.flipY] - flip the sprite on the vertical axis\n\t * @param {Vector2d} [settings.anchorPoint={x:0.5, y:0.5}] - Anchor point to draw the frame at (defaults to the center of the frame).\n\t * @example\n\t * // create a single sprite from a standalone image, with anchor in the center\n\t * let sprite = new me.Sprite(0, 0, {\n\t * image : \"PlayerTexture\",\n\t * framewidth : 64,\n\t * frameheight : 64,\n\t * anchorPoint : new me.Vector2d(0.5, 0.5)\n\t * });\n\t *\n\t * // create a single sprite from a packed texture\n\t * mytexture = new me.TextureAtlas(\n\t * me.loader.getJSON(\"texture\"),\n\t * me.loader.getImage(\"texture\")\n\t * );\n\t * let sprite = new me.Sprite(0, 0, {\n\t * image : mytexture,\n\t * region : \"npc2.png\",\n\t * });\n\t *\n\t * // create a video sprite\n\t * let videoSprite = new me.Sprite(0, 0, {\n\t * image : me.loader.getVideo(\"bigbunny\"),\n\t * anchorPoint : new me.Vector2d(0.5, 0.5)\n\t * });\n\t * // scale the video sprite\n\t * videoSprite.currentTransform.scale(2);\n\t * // start playing the video (if video is preloaded with `autoplay` set to false)\n\t * videoSprite.play();\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the super constructor\n\t\tsuper(x, y, 0, 0);\n\n\t\t/**\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.animationpause = false;\n\n\t\t/**\n\t\t * animation cycling speed (delay between frame in ms)\n\t\t * @type {number}\n\t\t * @default 100\n\t\t */\n\t\tthis.animationspeed = 100;\n\n\t\t/**\n\t\t * global offset for the position to draw from on the source image.\n\t\t * @type {Vector2d}\n\t\t * @default <0.0,0.0>\n\t\t */\n\t\tthis.offset = vector2dPool.get(0, 0);\n\n\t\t/**\n\t\t * true if this is a video sprite (e.g. a HTMLVideoElement was passed as as source)\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isVideo = false;\n\n\t\t/**\n\t\t * a callback fired when the end of a video or current animation was reached\n\t\t * @type {Function}\n\t\t * @default undefined\n\t\t */\n\t\t// this.onended;\n\n\t\t/**\n\t\t * The source texture object this sprite object is using\n\t\t * @type {TextureAtlas}\n\t\t */\n\t\tthis.source = null;\n\n\t\t// hold all defined animation\n\t\tthis.anim = {};\n\n\t\t// a flag to reset animation\n\t\tthis.resetAnim = undefined;\n\n\t\t// current frame information\n\t\t// (reusing current, any better/cleaner place?)\n\t\tthis.current = {\n\t\t\t// the current animation name\n\t\t\tname: undefined,\n\t\t\t// length of the current animation name\n\t\t\tlength: 0,\n\t\t\t//current frame texture offset\n\t\t\toffset: vector2dPool.get(0, 0),\n\t\t\t// current frame size\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\t// Source rotation angle for pre-rotating the source image\n\t\t\tangle: 0,\n\t\t\t// current frame index\n\t\t\tidx: 0,\n\t\t};\n\n\t\t// animation frame delta\n\t\tthis.dt = 0;\n\n\t\t/**\n\t\t * flicker settings\n\t\t * @ignore\n\t\t */\n\t\tthis._flicker = {\n\t\t\tisFlickering: false,\n\t\t\tduration: 0,\n\t\t\tcallback: null,\n\t\t\tstate: false,\n\t\t};\n\n\t\t// set the proper image/texture to use\n\t\tif (settings.image instanceof TextureAtlas) {\n\t\t\tthis.source = settings.image;\n\t\t\tthis.image = this.source.getTexture();\n\t\t\tthis.textureAtlas = settings.image;\n\t\t\t// check for defined region\n\t\t\tif (typeof settings.region !== \"undefined\") {\n\t\t\t\t// use a texture atlas\n\t\t\t\tconst region = this.source.getRegion(settings.region);\n\t\t\t\tif (region) {\n\t\t\t\t\t// set the sprite region within the texture\n\t\t\t\t\tthis.setRegion(region);\n\t\t\t\t} else {\n\t\t\t\t\t// throw an error\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Texture - region for \" + settings.region + \" not found\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// HTMLImageElement/HTMLVideoElementCanvas or {string}\n\t\t\tthis.image =\n\t\t\t\ttypeof settings.image === \"object\"\n\t\t\t\t\t? settings.image\n\t\t\t\t\t: getImage(settings.image);\n\t\t\t// throw an error if image ends up being null/undefined\n\t\t\tif (!this.image) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"me.Sprite: '\" + settings.image + \"' image/texture not found!\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.isVideo =\n\t\t\t\tglobalThis.HTMLVideoElement &&\n\t\t\t\tthis.image instanceof globalThis.HTMLVideoElement;\n\n\t\t\tif (this.isVideo) {\n\t\t\t\tthis.width =\n\t\t\t\t\tthis.current.width =\n\t\t\t\t\tsettings.framewidth =\n\t\t\t\t\t\tsettings.framewidth || this.image.videoWidth;\n\t\t\t\tthis.height =\n\t\t\t\t\tthis.current.height =\n\t\t\t\t\tsettings.frameheight =\n\t\t\t\t\t\tsettings.frameheight || this.image.videoHeight;\n\t\t\t\t// video specific parameter\n\t\t\t\tthis.animationpause = this.image.autoplay !== true;\n\t\t\t\tif (this.animationpause) {\n\t\t\t\t\tthis.image.pause();\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * pause the video when losing focus\n\t\t\t\t * @ignore\n\t\t\t\t */\n\t\t\t\tthis.removeStatePauseListener = eventEmitter.addListener(\n\t\t\t\t\t\"statePause\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.image.pause();\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// call the onended when the video has ended\n\t\t\t\tthis.image.onended = () => {\n\t\t\t\t\tif (typeof this.onended === \"function\") {\n\t\t\t\t\t\t// prevent the video from restarting if video.loop is false\n\t\t\t\t\t\tif (!this.image.loop) {\n\t\t\t\t\t\t\tthis.animationpause = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.onended();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// update the default \"current\" frame size\n\t\t\t\tthis.width =\n\t\t\t\t\tthis.current.width =\n\t\t\t\t\tsettings.framewidth =\n\t\t\t\t\t\tsettings.framewidth || this.image.width;\n\t\t\t\tthis.height =\n\t\t\t\t\tthis.current.height =\n\t\t\t\t\tsettings.frameheight =\n\t\t\t\t\t\tsettings.frameheight || this.image.height;\n\t\t\t\tthis.source = renderer.cache.get(this.image, settings);\n\t\t\t\tthis.textureAtlas = this.source.getAtlas();\n\t\t\t}\n\t\t}\n\n\t\t// store/reset the current atlas information if specified\n\t\tif (typeof settings.atlas !== \"undefined\") {\n\t\t\tthis.textureAtlas = settings.atlas;\n\t\t\tthis.atlasIndices = settings.atlasIndices;\n\t\t}\n\n\t\t// apply flip flags if specified\n\t\tif (typeof settings.flipX !== \"undefined\") {\n\t\t\tthis.flipX(!!settings.flipX);\n\t\t}\n\t\tif (typeof settings.flipY !== \"undefined\") {\n\t\t\tthis.flipY(!!settings.flipY);\n\t\t}\n\n\t\t// set the default rotation angle is defined in the settings\n\t\t// * WARNING: rotating sprites decreases performance with Canvas Renderer\n\t\tif (typeof settings.rotation !== \"undefined\") {\n\t\t\tthis.rotate(settings.rotation);\n\t\t}\n\n\t\t// update anchorPoint\n\t\tif (settings.anchorPoint) {\n\t\t\tthis.anchorPoint.set(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t}\n\n\t\tif (typeof settings.tint !== \"undefined\") {\n\t\t\tif (settings.tint instanceof Color) {\n\t\t\t\tthis.tint.copy(settings.tint);\n\t\t\t} else {\n\t\t\t\t// string (#RGB, #ARGB, #RRGGBB, #AARRGGBB)\n\t\t\t\tthis.tint.parseCSS(settings.tint);\n\t\t\t}\n\t\t}\n\n\t\t// set the sprite name if specified\n\t\tif (typeof settings.name === \"string\") {\n\t\t\tthis.name = settings.name;\n\t\t}\n\n\t\t// displaying order\n\t\tif (typeof settings.z !== \"undefined\") {\n\t\t\tthis.pos.z = settings.z;\n\t\t}\n\n\t\t// add predefined animations if defined (e.g. aseprite)\n\t\tif (typeof settings.anims !== \"undefined\") {\n\t\t\tfor (const anim in settings.anims) {\n\t\t\t\tthis.addAnimation(\n\t\t\t\t\tsettings.anims[anim].name,\n\t\t\t\t\tsettings.anims[anim].index,\n\t\t\t\t\tsettings.anims[anim].speed,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// addAnimation will return 0 if no texture atlas is defined\n\t\tif (!this.isVideo && this.addAnimation(\"default\", null) !== 0) {\n\t\t\t// set as default\n\t\t\tthis.setCurrentAnimation(\"default\");\n\t\t}\n\t}\n\n\t/**\n\t * return the flickering state of the object\n\t * @returns {boolean}\n\t */\n\tisFlickering() {\n\t\treturn this._flicker.isFlickering;\n\t}\n\n\t/**\n\t * play or resume the current animation or video\n\t */\n\tplay() {\n\t\tthis.animationpause = false;\n\t}\n\n\t/**\n\t * play or resume the current animation or video\n\t */\n\tpause() {\n\t\tthis.animationpause = true;\n\t}\n\n\t/**\n\t * make the object flicker\n\t * @param {number} duration - expressed in milliseconds\n\t * @param {Function} [callback] - Function to call when flickering ends\n\t * @returns {Sprite} Reference to this object for method chaining\n\t * @example\n\t * // make the object flicker for 1 second\n\t * // and then remove it\n\t * this.flicker(1000, function () {\n\t * world.removeChild(this);\n\t * });\n\t */\n\tflicker(duration, callback = undefined) {\n\t\tthis._flicker.duration = duration;\n\t\tif (this._flicker.duration <= 0) {\n\t\t\tthis._flicker.isFlickering = false;\n\t\t\tthis._flicker.callback = undefined;\n\t\t} else if (!this._flicker.isFlickering) {\n\t\t\tthis._flicker.callback = callback;\n\t\t\tthis._flicker.isFlickering = true;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * add an animation <br>\n\t * For fixed-sized cell sprite sheet, the index list must follow the\n\t * logic as per the following example :<br>\n\t * <img src=\"images/spritesheet_grid.png\"/>\n\t * @param {string} name - animation id\n\t * @param {number[]|string[]|object[]} index - list of sprite index or name defining the animation. Can also use objects to specify delay for each frame, see below\n\t * @param {number} [animationspeed] - cycling speed for animation in ms\n\t * @returns {number} frame amount of frame added to the animation (delay between each frame).\n\t * @see Sprite#animationspeed\n\t * @example\n\t * // walking animation\n\t * this.addAnimation(\"walk\", [ 0, 1, 2, 3, 4, 5 ]);\n\t * // standing animation\n\t * this.addAnimation(\"stand\", [ 11, 12 ]);\n\t * // eating animation\n\t * this.addAnimation(\"eat\", [ 6, 6 ]);\n\t * // rolling animation\n\t * this.addAnimation(\"roll\", [ 7, 8, 9, 10 ]);\n\t * // slower animation\n\t * this.addAnimation(\"roll\", [ 7, 8, 9, 10 ], 200);\n\t * // or get more specific with delay for each frame. Good solution instead of repeating:\n\t * this.addAnimation(\"turn\", [{ name: 0, delay: 200 }, { name: 1, delay: 100 }])\n\t * // can do this with atlas values as well:\n\t * this.addAnimation(\"turn\", [{ name: \"turnone\", delay: 200 }, { name: \"turntwo\", delay: 100 }])\n\t * // define an dying animation that stop on the last frame\n\t * this.addAnimation(\"die\", [{ name: 3, delay: 200 }, { name: 4, delay: 100 }, { name: 5, delay: Infinity }])\n\t * // set the standing animation as default\n\t * this.setCurrentAnimation(\"stand\");\n\t */\n\taddAnimation(name, index, animationspeed) {\n\t\tthis.anim[name] = {\n\t\t\tname: name,\n\t\t\tframes: [],\n\t\t\tidx: 0,\n\t\t\tlength: 0,\n\t\t};\n\n\t\t// # of frames\n\t\tlet counter = 0;\n\n\t\tif (typeof this.textureAtlas !== \"object\") {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (index == null) {\n\t\t\tindex = [];\n\t\t\t// create a default animation with all frame\n\t\t\tObject.keys(this.textureAtlas).forEach((v, i) => {\n\t\t\t\tindex[i] = i;\n\t\t\t});\n\t\t}\n\n\t\t// set each frame configuration (offset, size, etc..)\n\t\tfor (let i = 0, len = index.length; i < len; i++) {\n\t\t\tconst frame = index[i];\n\t\t\tlet frameObject;\n\t\t\tif (typeof frame === \"number\" || typeof frame === \"string\") {\n\t\t\t\tframeObject = {\n\t\t\t\t\tname: frame,\n\t\t\t\t\tdelay: animationspeed || this.animationspeed,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tframeObject = frame;\n\t\t\t}\n\t\t\tconst frameObjectName = frameObject.name;\n\t\t\tif (typeof frameObjectName === \"number\") {\n\t\t\t\tif (typeof this.textureAtlas[frameObjectName] !== \"undefined\") {\n\t\t\t\t\t// TODO: adding the cache source coordinates add undefined entries in webGL mode\n\t\t\t\t\tthis.anim[name].frames[i] = Object.assign(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tthis.textureAtlas[frameObjectName],\n\t\t\t\t\t\tframeObject,\n\t\t\t\t\t);\n\t\t\t\t\tcounter++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// string\n\t\t\t\tif (this.source.getFormat().includes(\"Spritesheet\")) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"string parameters for addAnimation are not allowed for standard spritesheet based Texture\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.anim[name].frames[i] = Object.assign(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tthis.textureAtlas[this.atlasIndices[frameObjectName]],\n\t\t\t\t\t\tframeObject,\n\t\t\t\t\t);\n\t\t\t\t\tcounter++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.anim[name].length = counter;\n\n\t\treturn counter;\n\t}\n\n\t/**\n\t * set the current animation\n\t * this will always change the animation & set the frame to zero\n\t * @param {string} name - animation id\n\t * @param {string|Function} [resetAnim] - animation id to switch to when complete, or callback\n\t * @param {boolean} [preserve_dt=false] - if false will reset the elapsed time counter since last frame\n\t * @returns {Sprite} Reference to this object for method chaining\n\t * @example\n\t * // set \"walk\" animation\n\t * this.setCurrentAnimation(\"walk\");\n\t *\n\t * // set \"walk\" animation if it is not the current animation\n\t * if (this.isCurrentAnimation(\"walk\")) {\n\t * this.setCurrentAnimation(\"walk\");\n\t * }\n\t *\n\t * // set \"eat\" animation, and switch to \"walk\" when complete\n\t * this.setCurrentAnimation(\"eat\", \"walk\");\n\t *\n\t * // set \"die\" animation, and remove the object when finished\n\t * this.setCurrentAnimation(\"die\", () => {\n\t * world.removeChild(this);\n\t * return false; // do not reset to first frame\n\t * });\n\t *\n\t * // set \"attack\" animation, and pause for a short duration\n\t * this.setCurrentAnimation(\"die\", () => {\n\t * this.animationpause = true;\n\t *\n\t * // back to \"standing\" animation after 1 second\n\t * setTimeout(function () {\n\t * this.setCurrentAnimation(\"standing\");\n\t * }, 1000);\n\t *\n\t * return false; // do not reset to first frame\n\t * });\n\t */\n\tsetCurrentAnimation(name, resetAnim, preserve_dt = false) {\n\t\tif (typeof this.anim[name] !== \"undefined\") {\n\t\t\tif (!this.isCurrentAnimation(name)) {\n\t\t\t\tthis.current.name = name;\n\t\t\t\tthis.current.length = this.anim[this.current.name].length;\n\t\t\t\tif (typeof resetAnim === \"string\") {\n\t\t\t\t\tthis.resetAnim = this.setCurrentAnimation.bind(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tresetAnim,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t} else if (typeof resetAnim === \"function\") {\n\t\t\t\t\tthis.resetAnim = resetAnim;\n\t\t\t\t} else {\n\t\t\t\t\tthis.resetAnim = undefined;\n\t\t\t\t}\n\t\t\t\tthis.setAnimationFrame(0);\n\t\t\t\tif (!preserve_dt) {\n\t\t\t\t\tthis.dt = 0;\n\t\t\t\t}\n\t\t\t\tthis.isDirty = true;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"animation id '\" + name + \"' not defined\");\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * reverse the given or current animation if none is specified\n\t * @param {string} [name] - animation id\n\t * @returns {Sprite} Reference to this object for method chaining\n\t * @see Sprite#animationspeed\n\t */\n\treverseAnimation(name) {\n\t\tif (typeof name !== \"undefined\" && typeof this.anim[name] !== \"undefined\") {\n\t\t\tthis.anim[name].frames.reverse();\n\t\t} else {\n\t\t\tthis.anim[this.current.name].frames.reverse();\n\t\t}\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * return true if the specified animation is the current one.\n\t * @param {string} name - animation id\n\t * @returns {boolean}\n\t * @example\n\t * if (!this.isCurrentAnimation(\"walk\")) {\n\t * // do something funny...\n\t * }\n\t */\n\tisCurrentAnimation(name) {\n\t\treturn this.current.name === name;\n\t}\n\n\t/**\n\t * change the current texture atlas region for this sprite\n\t * @see Texture.getRegion\n\t * @param {object} region - typically returned through me.Texture.getRegion()\n\t * @returns {Sprite} Reference to this object for method chaining\n\t * @example\n\t * // change the sprite to \"shadedDark13.png\";\n\t * mySprite.setRegion(mytexture.getRegion(\"shadedDark13.png\"));\n\t */\n\tsetRegion(region) {\n\t\t// set the source texture for the given region\n\t\tthis.image = this.source.getTexture(region);\n\t\t// set the sprite offset within the texture\n\t\tthis.current.offset.setV(region.offset);\n\t\t// set angle if defined\n\t\tthis.current.angle = typeof region.angle === \"number\" ? region.angle : 0;\n\t\t// update the default \"current\" size\n\t\tthis.width = this.current.width = region.width;\n\t\tthis.height = this.current.height = region.height;\n\t\t// set global anchortPoint if defined\n\t\tif (region.anchorPoint) {\n\t\t\tthis.anchorPoint.setMuted(\n\t\t\t\tthis._flip.x && region.trimmed === true\n\t\t\t\t\t? 1 - region.anchorPoint.x\n\t\t\t\t\t: region.anchorPoint.x,\n\t\t\t\tthis._flip.y && region.trimmed === true\n\t\t\t\t\t? 1 - region.anchorPoint.y\n\t\t\t\t\t: region.anchorPoint.y,\n\t\t\t);\n\t\t}\n\t\t// update the sprite bounding box\n\t\tthis.updateBounds();\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * force the current animation frame index.\n\t * @param {number} [index=0] - animation frame index\n\t * @returns {Sprite} Reference to this object for method chaining\n\t * @example\n\t * // reset the current animation to the first frame\n\t * this.setAnimationFrame();\n\t */\n\tsetAnimationFrame(index = 0) {\n\t\tthis.current.idx = index % this.current.length;\n\t\treturn this.setRegion(\n\t\t\tthis.getAnimationFrameObjectByIndex(this.current.idx),\n\t\t);\n\t}\n\n\t/**\n\t * return the current animation frame index.\n\t * @returns {number} current animation frame index\n\t */\n\tgetCurrentAnimationFrame() {\n\t\treturn this.current.idx;\n\t}\n\n\t/**\n\t * Returns the frame object by the index.\n\t * @ignore\n\t * @param {number} id - the frame id\n\t * @returns {number} if using number indices. Returns {object} containing frame data if using texture atlas\n\t */\n\tgetAnimationFrameObjectByIndex(id) {\n\t\treturn this.anim[this.current.name].frames[id];\n\t}\n\n\t/**\n\t * update function. <br>\n\t * automatically called by the game manager {@link game}\n\t * @protected\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean} true if the Sprite is dirty\n\t */\n\tupdate(dt) {\n\t\t// play/pause video if necessary\n\t\tif (this.isVideo) {\n\t\t\tif (this.animationpause) {\n\t\t\t\tthis.image.pause();\n\t\t\t} else if (this.image.paused) {\n\t\t\t\tthis.image.play();\n\t\t\t}\n\t\t\tthis.isDirty = !this.image.paused;\n\t\t} else {\n\t\t\t// Update animation if necessary\n\t\t\tif (!this.animationpause && this.current.length > 1) {\n\t\t\t\tlet duration = this.getAnimationFrameObjectByIndex(\n\t\t\t\t\tthis.current.idx,\n\t\t\t\t).delay;\n\t\t\t\tthis.dt += dt;\n\t\t\t\twhile (this.dt >= duration) {\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.dt -= duration;\n\n\t\t\t\t\tconst nextFrame =\n\t\t\t\t\t\tthis.current.length > 1 ? this.current.idx + 1 : this.current.idx;\n\t\t\t\t\tthis.setAnimationFrame(nextFrame);\n\n\t\t\t\t\t// Switch animation if we reach the end of the strip and a callback is defined\n\t\t\t\t\tif (this.current.idx === 0) {\n\t\t\t\t\t\tif (typeof this.onended === \"function\") {\n\t\t\t\t\t\t\tthis.onended();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof this.resetAnim === \"function\") {\n\t\t\t\t\t\t\t// Otherwise is must be callable\n\t\t\t\t\t\t\tif (this.resetAnim() === false) {\n\t\t\t\t\t\t\t\t// Reset to last frame\n\t\t\t\t\t\t\t\tthis.setAnimationFrame(this.current.length - 1);\n\n\t\t\t\t\t\t\t\t// Bail early without skipping any more frames.\n\t\t\t\t\t\t\t\tthis.dt %= duration;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Get next frame duration\n\t\t\t\t\tduration = this.getAnimationFrameObjectByIndex(\n\t\t\t\t\t\tthis.current.idx,\n\t\t\t\t\t).delay;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//update the \"flickering\" state if necessary\n\t\tif (this._flicker.isFlickering) {\n\t\t\tthis._flicker.duration -= dt;\n\t\t\tif (this._flicker.duration < 0) {\n\t\t\t\tif (typeof this._flicker.callback === \"function\") {\n\t\t\t\t\tthis._flicker.callback();\n\t\t\t\t}\n\t\t\t\tthis.flicker(-1);\n\t\t\t}\n\t\t\tthis.isDirty = true;\n\t\t}\n\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * draw this srite (automatically called by melonJS)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer) {\n\t\t// do nothing if we are flickering\n\t\tif (this._flicker.isFlickering) {\n\t\t\tthis._flicker.state = !this._flicker.state;\n\t\t\tif (!this._flicker.state) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// the frame to draw\n\t\tconst frame = this.current;\n\n\t\t// cache the current position and size\n\t\tlet xpos = this.pos.x;\n\t\tconst ypos = this.pos.y;\n\n\t\tlet w = frame.width;\n\t\tlet h = frame.height;\n\n\t\t// frame offset in the texture/atlas\n\t\tconst frame_offset = frame.offset;\n\t\tconst g_offset = this.offset;\n\n\t\t// remove image's TexturePacker/ShoeBox rotation\n\t\tif (frame.angle !== 0) {\n\t\t\trenderer.translate(-xpos, -ypos);\n\t\t\trenderer.rotate(frame.angle);\n\t\t\txpos -= h;\n\t\t\tw = frame.height;\n\t\t\th = frame.width;\n\t\t}\n\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tg_offset.x + frame_offset.x, // sx\n\t\t\tg_offset.y + frame_offset.y, // sy\n\t\t\tw,\n\t\t\th, // sw,sh\n\t\t\txpos,\n\t\t\typos, // dx,dy\n\t\t\tw,\n\t\t\th, // dw,dh\n\t\t);\n\t}\n\n\t/**\n\t * Destroy function<br>\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tvector2dPool.release(this.offset);\n\t\tthis.offset = undefined;\n\t\tif (this.isVideo) {\n\t\t\tthis.removeStatePauseListener();\n\t\t\tthis.image.onended = undefined;\n\t\t\tthis.image.pause();\n\t\t\tthis.image.currentTime = 0;\n\t\t}\n\t\tthis.image = undefined;\n\t\tsuper.destroy();\n\t}\n}\n", "import { Rect } from \"./../geometries/rectangle.ts\";\nimport { game } from \"../index.js\";\nimport { colorPool } from \"../math/color.ts\";\nimport { clamp, toBeCloseTo } from \"./../math/math.ts\";\nimport { Matrix2d } from \"../math/matrix2d.ts\";\nimport { Matrix3d } from \"../math/matrix3d.ts\";\nimport { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport { Vector3d } from \"../math/vector3d.ts\";\nimport { boundsPool } from \"./../physics/bounds.ts\";\nimport Renderable from \"./../renderable/renderable.js\";\nimport {\n\tCANVAS_ONRESIZE,\n\teventEmitter,\n\tGAME_RESET,\n\tVIEWPORT_ONCHANGE,\n\tVIEWPORT_ONRESIZE,\n} from \"../system/event.ts\";\nimport { tweenPool } from \"../tweens/tween.ts\";\nimport { renderer } from \"./../video/video.js\";\n\n/**\n * @import {Bounds} from \"./../physics/bounds.ts\";\n * @import {Color} from \"./../math/color.ts\";\n * @import Entity from \"./../renderable/entity/entity.js\";\n * @import Sprite from \"./../renderable/sprite.js\";\n * @import NineSliceSprite from \"./../renderable/nineslicesprite.js\";\n */\n\nconst targetV = new Vector2d();\n\n/**\n * a 2D orthographic camera\n */\nexport default class Camera2d extends Renderable {\n\t/**\n\t * @param {number} minX - start x offset\n\t * @param {number} minY - start y offset\n\t * @param {number} maxX - end x offset\n\t * @param {number} maxY - end y offset\n\t */\n\tconstructor(minX, minY, maxX, maxY) {\n\t\tsuper(minX, minY, maxX - minX, maxY - minY);\n\n\t\t/**\n\t\t * Axis definition\n\t\t * @enum {number}\n\t\t * @property {number} NONE no axis\n\t\t * @property {number} HORIZONTAL horizontal axis only\n\t\t * @property {number} VERTICAL vertical axis only\n\t\t * @property {number} BOTH both axis\n\t\t * @readonly\n\t\t */\n\t\tthis.AXIS = {\n\t\t\tNONE: 0,\n\t\t\tHORIZONTAL: 1,\n\t\t\tVERTICAL: 2,\n\t\t\tBOTH: 3,\n\t\t};\n\n\t\t/**\n\t\t * Camera bounds\n\t\t * @type {Bounds}\n\t\t */\n\t\tthis.bounds = boundsPool.get();\n\n\t\t/**\n\t\t * enable or disable damping\n\t\t * @private\n\t\t * @default true\n\t\t */\n\t\tthis.smoothFollow = true;\n\n\t\t/**\n\t\t * Camera damping for smooth transition [0 .. 1].\n\t\t * 1 being the maximum value and will snap the camera to the target position\n\t\t * @type {number}\n\t\t * @default 1.0\n\t\t */\n\t\tthis.damping = 1.0;\n\n\t\t/**\n\t\t * the closest point relative to the camera\n\t\t * @type {number}\n\t\t * @default -1000\n\t\t */\n\t\tthis.near = -1000;\n\n\t\t/**\n\t\t * the furthest point relative to the camera.\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = 1000;\n\n\t\t/**\n\t\t * the default camera projection matrix\n\t\t * (2d cameras use an orthographic projection by default).\n\t\t * @type {Matrix3d}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix3d();\n\n\t\t/**\n\t\t * the invert camera transform used to unproject points\n\t\t * @ignore\n\t\t * @type {Matrix2d}\n\t\t */\n\t\tthis.invCurrentTransform = new Matrix2d();\n\n\t\t// offset for shake effect\n\t\tthis.offset = new Vector2d();\n\n\t\t// target to follow\n\t\tthis.target = null;\n\n\t\t// default value follow\n\t\tthis.follow_axis = this.AXIS.NONE;\n\n\t\t/**\n\t\t * shake variables\n\t\t * @ignore\n\t\t */\n\t\tthis._shake = {\n\t\t\tintensity: 0,\n\t\t\tduration: 0,\n\t\t\taxis: this.AXIS.BOTH,\n\t\t\tonComplete: null,\n\t\t};\n\n\t\t/**\n\t\t * flash variables\n\t\t * @ignore\n\t\t */\n\t\tthis._fadeOut = {\n\t\t\tcolor: null,\n\t\t\ttween: null,\n\t\t};\n\n\t\t/**\n\t\t * fade variables\n\t\t * @ignore\n\t\t */\n\t\tthis._fadeIn = {\n\t\t\tcolor: null,\n\t\t\ttween: null,\n\t\t};\n\n\t\t// default camera name\n\t\tthis.name = \"default\";\n\n\t\t// set a default deadzone\n\t\tthis.setDeadzone(this.width / 6, this.height / 6);\n\n\t\t// for backward \"compatiblity\" (in terms of behavior)\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t// enable event detection on the camera\n\t\tthis.isKinematic = false;\n\n\t\tthis.bounds.setMinMax(minX, minY, maxX, maxY);\n\n\t\t// update the projection matrix\n\t\tthis._updateProjectionMatrix();\n\n\t\t// subscribe to the game reset event\n\t\teventEmitter.addListener(GAME_RESET, this.reset.bind(this));\n\t\t// subscribe to the canvas resize event\n\t\teventEmitter.addListener(CANVAS_ONRESIZE, this.resize.bind(this));\n\t}\n\n\t// -- some private function ---\n\n\t/** @ignore */\n\t// update the projection matrix based on the projection frame (a rectangle)\n\t_updateProjectionMatrix() {\n\t\tthis.projectionMatrix.ortho(\n\t\t\t0,\n\t\t\tthis.width,\n\t\t\tthis.height,\n\t\t\t0,\n\t\t\tthis.near,\n\t\t\tthis.far,\n\t\t);\n\t}\n\n\t/** @ignore */\n\t_followH(target) {\n\t\tlet targetX = this.pos.x;\n\t\tif (target.x - this.pos.x > this.deadzone.right) {\n\t\t\ttargetX = Math.min(\n\t\t\t\ttarget.x - this.deadzone.right,\n\t\t\t\tthis.bounds.width - this.width,\n\t\t\t);\n\t\t} else if (target.x - this.pos.x < this.deadzone.pos.x) {\n\t\t\ttargetX = Math.max(target.x - this.deadzone.pos.x, this.bounds.left);\n\t\t}\n\t\treturn targetX;\n\t}\n\n\t/** @ignore */\n\t_followV(target) {\n\t\tlet targetY = this.pos.y;\n\t\tif (target.y - this.pos.y > this.deadzone.bottom) {\n\t\t\ttargetY = Math.min(\n\t\t\t\ttarget.y - this.deadzone.bottom,\n\t\t\t\tthis.bounds.height - this.height,\n\t\t\t);\n\t\t} else if (target.y - this.pos.y < this.deadzone.pos.y) {\n\t\t\ttargetY = Math.max(target.y - this.deadzone.pos.y, this.bounds.top);\n\t\t}\n\t\treturn targetY;\n\t}\n\n\t// -- public function ---\n\n\t/**\n\t * reset the camera position to specified coordinates\n\t * @param {number} [x=0] - initial position of the camera on the x axis\n\t * @param {number} [y=0] - initial position of the camera on the y axis\n\t */\n\treset(x = 0, y = 0) {\n\t\t// reset the initial camera position to 0,0\n\t\tthis.pos.x = x;\n\t\tthis.pos.y = y;\n\n\t\t// reset the target\n\t\tthis.unfollow();\n\n\t\t// damping default value\n\t\tthis.smoothFollow = true;\n\t\tthis.damping = 1.0;\n\n\t\t// reset the transformation matrix\n\t\tthis.currentTransform.identity();\n\t\tthis.invCurrentTransform.identity().invert();\n\n\t\t// update the projection matrix\n\t\tthis._updateProjectionMatrix();\n\t}\n\n\t/**\n\t * change the deadzone settings.\n\t * the \"deadzone\" defines an area within the current camera in which\n\t * the followed renderable can move without scrolling the camera.\n\t * @see {@link follow}\n\t * @param {number} w - deadzone width\n\t * @param {number} h - deadzone height\n\t */\n\tsetDeadzone(w, h) {\n\t\tif (typeof this.deadzone === \"undefined\") {\n\t\t\tthis.deadzone = new Rect(0, 0, 0, 0);\n\t\t}\n\n\t\t// reusing the old code for now...\n\t\tthis.deadzone.pos.set(\n\t\t\t~~((this.width - w) / 2),\n\t\t\t~~((this.height - h) / 2 - h * 0.25),\n\t\t);\n\t\tthis.deadzone.resize(w, h);\n\n\t\tthis.smoothFollow = false;\n\n\t\t// force a camera update\n\t\tthis.updateTarget();\n\n\t\tthis.smoothFollow = true;\n\t}\n\n\t/**\n\t * resize the camera\n\t * @param {number} w - new width of the camera\n\t * @param {number} h - new height of the camera\n\t * @returns {Camera2d} this camera\n\t */\n\tresize(w, h) {\n\t\t// parent consctructor, resize camera rect\n\t\tsuper.resize(w, h);\n\n\t\t// disable damping while resizing\n\t\tthis.smoothFollow = false;\n\n\t\t// reset everything\n\t\tthis.setBounds(0, 0, w, h);\n\t\tthis.setDeadzone(w / 6, h / 6);\n\t\tthis.update();\n\t\tthis.smoothFollow = true;\n\n\t\t// update the projection matrix\n\t\tthis._updateProjectionMatrix();\n\n\t\t// publish the viewport resize event\n\t\teventEmitter.emit(VIEWPORT_ONRESIZE, this.width, this.height);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the camera boundaries (set to the world limit by default).\n\t * the camera is bound to the given coordinates and cannot move/be scrolled outside of it.\n\t * @param {number} x - world left limit\n\t * @param {number} y - world top limit\n\t * @param {number} w - world width limit\n\t * @param {number} h - world height limit\n\t */\n\tsetBounds(x, y, w, h) {\n\t\tthis.smoothFollow = false;\n\t\tthis.bounds.setMinMax(x, y, w + x, h + y);\n\t\tthis.moveTo(this.pos.x, this.pos.y);\n\t\tthis.update();\n\t\tthis.smoothFollow = true;\n\t}\n\n\t/**\n\t * set the camera to follow the specified renderable. <br>\n\t * (this will put the camera center around the given target)\n\t * @param {Renderable|Vector2d} target - renderable or position vector to follow\n\t * @param {number} [axis=me.game.viewport.AXIS.BOTH] - Which axis to follow (see {@link Camera2d.AXIS})\n\t * @param {number} [damping=1] - default damping value\n\t * @example\n\t * // set the camera to follow this renderable on both axis, and enable damping\n\t * me.game.viewport.follow(this, me.game.viewport.AXIS.BOTH, 0.1);\n\t */\n\tfollow(target, axis, damping) {\n\t\tif (target instanceof Renderable) {\n\t\t\tthis.target = target.pos;\n\t\t} else if (target instanceof Vector2d || target instanceof Vector3d) {\n\t\t\tthis.target = target;\n\t\t} else {\n\t\t\tthrow new Error(\"invalid target for me.Camera2d.follow\");\n\t\t}\n\t\t// if axis is null, camera is moved on target center\n\t\tthis.follow_axis = typeof axis === \"undefined\" ? this.AXIS.BOTH : axis;\n\n\t\tthis.smoothFollow = false;\n\n\t\tif (typeof damping !== \"number\") {\n\t\t\tthis.damping = 1;\n\t\t} else {\n\t\t\tthis.damping = clamp(damping, 0.0, 1.0);\n\t\t}\n\n\t\t// force a camera update\n\t\tthis.updateTarget();\n\n\t\tthis.smoothFollow = true;\n\t}\n\n\t/**\n\t * unfollow the current target\n\t */\n\tunfollow() {\n\t\tthis.target = null;\n\t\tthis.follow_axis = this.AXIS.NONE;\n\t}\n\n\t/**\n\t * move the camera upper-left position by the specified offset.\n\t * @see {@link focusOn}\n\t * @param {number} x - horizontal offset\n\t * @param {number} y - vertical offset\n\t * @example\n\t * // Move the camera up by four pixels\n\t * me.game.viewport.move(0, -4);\n\t */\n\tmove(x, y) {\n\t\tthis.moveTo(this.pos.x + x, this.pos.y + y);\n\t}\n\n\t/**\n\t * move the camera upper-left position to the specified coordinates\n\t * @see {@link focusOn}\n\t * @param {number} x\n\t * @param {number} y\n\t */\n\tmoveTo(x, y) {\n\t\tconst _x = this.pos.x;\n\t\tconst _y = this.pos.y;\n\n\t\tthis.pos.x = clamp(x, this.bounds.left, this.bounds.width - this.width);\n\t\tthis.pos.y = clamp(y, this.bounds.top, this.bounds.height - this.height);\n\n\t\t//publish the VIEWPORT_ONCHANGE event if necessary\n\t\tif (_x !== this.pos.x || _y !== this.pos.y) {\n\t\t\tthis.isDirty = true;\n\t\t}\n\t}\n\n\t/** @ignore */\n\tupdateTarget() {\n\t\tif (this.target) {\n\t\t\ttargetV.setV(this.pos);\n\n\t\t\tswitch (this.follow_axis) {\n\t\t\t\tcase this.AXIS.NONE:\n\t\t\t\t\t//this.focusOn(this.target);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase this.AXIS.HORIZONTAL:\n\t\t\t\t\ttargetV.x = this._followH(this.target);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase this.AXIS.VERTICAL:\n\t\t\t\t\ttargetV.y = this._followV(this.target);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase this.AXIS.BOTH:\n\t\t\t\t\ttargetV.x = this._followH(this.target);\n\t\t\t\t\ttargetV.y = this._followV(this.target);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!this.pos.equals(targetV)) {\n\t\t\t\t// update the camera position\n\t\t\t\tif (this.smoothFollow === true && this.damping < 1.0) {\n\t\t\t\t\t// account for floating precision and check if we are close \"enough\"\n\t\t\t\t\tif (\n\t\t\t\t\t\ttoBeCloseTo(targetV.x, this.pos.x, 2) &&\n\t\t\t\t\t\ttoBeCloseTo(targetV.y, this.pos.y, 2)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.pos.setV(targetV);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.pos.lerp(targetV, this.damping);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.pos.setV(targetV);\n\t\t\t\t}\n\t\t\t\tthis.isDirty = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @ignore */\n\tupdate(dt) {\n\t\t// update the camera position\n\t\tthis.updateTarget(dt);\n\n\t\tif (this._shake.duration > 0) {\n\t\t\tthis._shake.duration -= dt;\n\t\t\tif (this._shake.duration <= 0) {\n\t\t\t\tthis._shake.duration = 0;\n\t\t\t\tthis.offset.setZero();\n\t\t\t\tif (typeof this._shake.onComplete === \"function\") {\n\t\t\t\t\tthis._shake.onComplete();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tthis._shake.axis === this.AXIS.BOTH ||\n\t\t\t\t\tthis._shake.axis === this.AXIS.HORIZONTAL\n\t\t\t\t) {\n\t\t\t\t\tthis.offset.x = (Math.random() - 0.5) * this._shake.intensity;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis._shake.axis === this.AXIS.BOTH ||\n\t\t\t\t\tthis._shake.axis === this.AXIS.VERTICAL\n\t\t\t\t) {\n\t\t\t\t\tthis.offset.y = (Math.random() - 0.5) * this._shake.intensity;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// updated!\n\t\t\tthis.isDirty = true;\n\t\t}\n\n\t\tif (this.isDirty === true) {\n\t\t\t//publish the corresponding message\n\t\t\teventEmitter.emit(VIEWPORT_ONCHANGE, this.pos);\n\t\t}\n\n\t\t// check for fade/flash effect\n\t\tif (this._fadeIn.tween != null || this._fadeOut.tween != null) {\n\t\t\tthis.isDirty = true;\n\t\t}\n\n\t\tif (!this.currentTransform.isIdentity()) {\n\t\t\tthis.invCurrentTransform.copy(this.currentTransform).invert();\n\t\t} else {\n\t\t\t// reset to default\n\t\t\tthis.invCurrentTransform.identity();\n\t\t}\n\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * shake the camera\n\t * @param {number} intensity - maximum offset that the screen can be moved\n\t * while shaking\n\t * @param {number} duration - expressed in milliseconds\n\t * @param {number} [axis=me.game.viewport.AXIS.BOTH] - specify on which axis to apply the shake effect (see {@link Camera2d.AXIS})\n\t * @param {Function} [onComplete] - callback once shaking effect is over\n\t * @param {boolean} [force] - if true this will override the current effect\n\t * @example\n\t * // shake it baby !\n\t * me.game.viewport.shake(10, 500, me.game.viewport.AXIS.BOTH);\n\t */\n\tshake(intensity, duration, axis, onComplete, force) {\n\t\tif (this._shake.duration === 0 || force === true) {\n\t\t\tthis._shake.intensity = intensity;\n\t\t\tthis._shake.duration = duration;\n\t\t\tthis._shake.axis = axis || this.AXIS.BOTH;\n\t\t\tthis._shake.onComplete =\n\t\t\t\ttypeof onComplete === \"function\" ? onComplete : undefined;\n\t\t}\n\t}\n\n\t/**\n\t * fadeOut(flash) effect<p>\n\t * screen is filled with the specified color and slowly goes back to normal\n\t * @param {Color|string} color - a CSS color value\n\t * @param {number} [duration=1000] - expressed in milliseconds\n\t * @param {Function} [onComplete] - callback once effect is over\n\t * @example\n\t * // fade the camera to white upon dying, reload the level, and then fade out back\n\t * me.game.viewport.fadeIn(\"#fff\", 150, function() {\n\t * me.audio.play(\"die\", false);\n\t * me.level.reload();\n\t * me.game.viewport.fadeOut(\"#fff\", 150);\n\t * });\n\t */\n\tfadeOut(color, duration = 1000, onComplete) {\n\t\tthis._fadeOut.color = colorPool.get(color);\n\t\tthis._fadeOut.tween = tweenPool\n\t\t\t.get(this._fadeOut.color)\n\t\t\t.to({ alpha: 0.0 }, { duration })\n\t\t\t.onComplete(onComplete || null);\n\t\tthis._fadeOut.tween.isPersistent = true;\n\t\tthis._fadeOut.tween.start();\n\t}\n\n\t/**\n\t * fadeIn effect <p>\n\t * fade to the specified color\n\t * @param {Color|string} color - a CSS color value\n\t * @param {number} [duration=1000] - expressed in milliseconds\n\t * @param {Function} [onComplete] - callback once effect is over\n\t * @example\n\t * // flash the camera to white for 75ms\n\t * me.game.viewport.fadeIn(\"#FFFFFF\", 75);\n\t */\n\tfadeIn(color, duration = 1000, onComplete) {\n\t\tthis._fadeIn.color = colorPool.get(color);\n\t\tconst _alpha = this._fadeIn.color.alpha;\n\t\tthis._fadeIn.color.alpha = 0.0;\n\t\tthis._fadeIn.tween = tweenPool\n\t\t\t.get(this._fadeIn.color)\n\t\t\t.to({ alpha: _alpha }, { duration })\n\t\t\t.onComplete(onComplete || null);\n\t\tthis._fadeIn.tween.isPersistent = true;\n\t\tthis._fadeIn.tween.start();\n\t}\n\n\t/**\n\t * set the camera position around the specified object\n\t * @param {Renderable|Entity|Sprite|NineSliceSprite} target - the renderable to focus the camera on\n\t */\n\tfocusOn(target) {\n\t\tconst bounds = target.getBounds();\n\t\tthis.moveTo(\n\t\t\tbounds.left + bounds.width / 2 - this.width / 2,\n\t\t\tbounds.top + bounds.height / 2 - this.height / 2,\n\t\t);\n\t}\n\n\t/**\n\t * check if the specified renderable is in the camera\n\t * @param {Renderable|Entity|Sprite|NineSliceSprite} obj - to be checked against\n\t * @param {boolean} [floating = obj.floating] - if visibility check should be done against screen coordinates\n\t * @returns {boolean} true if within the viewport\n\t */\n\tisVisible(obj, floating = obj.floating) {\n\t\tif (floating === true || obj.floating === true) {\n\t\t\t// check against screen coordinates\n\t\t\treturn renderer.overlaps(obj.getBounds());\n\t\t} else {\n\t\t\t// check if within the current camera\n\t\t\treturn obj.getBounds().overlaps(this);\n\t\t}\n\t}\n\n\t/**\n\t * convert the given \"local\" (screen) coordinates into world coordinates\n\t * @param {number} x - the x coordinate of the local point to be converted\n\t * @param {number} y - the y coordinate of the local point to be converted\n\t * @param {Vector2d} [v] - an optional vector object where to set the converted value\n\t * @returns {Vector2d}\n\t */\n\tlocalToWorld(x, y, v) {\n\t\t// TODO memoization for one set of coords (multitouch)\n\t\tv = v || vector2dPool.get();\n\t\tv.set(x, y).add(this.pos).sub(game.world.pos);\n\t\tif (!this.currentTransform.isIdentity()) {\n\t\t\tthis.invCurrentTransform.apply(v);\n\t\t}\n\t\treturn v;\n\t}\n\n\t/**\n\t * convert the given world coordinates into \"local\" (screen) coordinates\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} [v] - an optional vector object where to set the converted value\n\t * @returns {Vector2d} a vector with the converted local coordinates\n\t */\n\tworldToLocal(x, y, v) {\n\t\t// TODO memoization for one set of coords (multitouch)\n\t\tv = v || vector2dPool.get();\n\t\tv.set(x, y);\n\t\tif (!this.currentTransform.isIdentity()) {\n\t\t\tthis.currentTransform.apply(v);\n\t\t}\n\t\treturn v.sub(this.pos).add(game.world.pos);\n\t}\n\n\t/**\n\t * render the camera effects\n\t * @ignore\n\t */\n\tdrawFX(renderer) {\n\t\t// fading effect\n\t\tif (this._fadeIn.tween) {\n\t\t\t// add an overlay\n\t\t\trenderer.save();\n\t\t\t// reset all transform so that the overaly cover the whole camera area\n\t\t\trenderer.resetTransform();\n\t\t\trenderer.setColor(this._fadeIn.color);\n\t\t\trenderer.fillRect(0, 0, this.width, this.height);\n\t\t\trenderer.restore();\n\t\t\t// remove the tween if over\n\t\t\tif (this._fadeIn.color.alpha === 1.0) {\n\t\t\t\tthis._fadeIn.tween = null;\n\t\t\t\tcolorPool.release(this._fadeIn.color);\n\t\t\t\tthis._fadeIn.color = null;\n\t\t\t}\n\t\t}\n\n\t\t// flashing effect\n\t\tif (this._fadeOut.tween) {\n\t\t\t// add an overlay\n\t\t\trenderer.save();\n\t\t\t// reset all transform so that the overaly cover the whole camera area\n\t\t\trenderer.resetTransform();\n\t\t\trenderer.setColor(this._fadeOut.color);\n\t\t\trenderer.fillRect(0, 0, this.width, this.height);\n\t\t\trenderer.restore();\n\t\t\t// remove the tween if over\n\t\t\tif (this._fadeOut.color.alpha === 0.0) {\n\t\t\t\tthis._fadeOut.tween = null;\n\t\t\t\tcolorPool.release(this._fadeOut.color);\n\t\t\t\tthis._fadeOut.color = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * draw all object visibile in this viewport\n\t * @ignore\n\t */\n\tdraw(renderer, container) {\n\t\tconst translateX = this.pos.x + this.offset.x;\n\t\tconst translateY = this.pos.y + this.offset.y;\n\n\t\t// translate the world coordinates by default to screen coordinates\n\t\tcontainer.currentTransform.translate(-translateX, -translateY);\n\n\t\t// set the camera projection\n\t\trenderer.setProjection(this.projectionMatrix);\n\n\t\t// clip to camera bounds\n\t\trenderer.clipRect(0, 0, this.width, this.height);\n\n\t\tthis.preDraw(renderer);\n\n\t\tcontainer.preDraw(renderer, this);\n\n\t\t// draw all objects,\n\t\t// specifying the viewport as the rectangle area to redraw\n\t\tcontainer.draw(renderer, this);\n\n\t\t// draw the viewport/camera effects\n\t\tthis.drawFX(renderer);\n\n\t\tcontainer.postDraw(renderer, this);\n\n\t\tthis.postDraw(renderer);\n\n\t\t// translate the world coordinates by default to screen coordinates\n\t\tcontainer.currentTransform.translate(translateX, translateY);\n\t}\n}\n", "import Camera2d from \"./../camera/camera2d.js\";\nimport { Color } from \"./../math/color.ts\";\nimport { eventEmitter, STAGE_RESET } from \"../system/event.ts\";\nimport { renderer } from \"./../video/video.js\";\n\n// a default camera instance to use across all stages\nlet default_camera;\n\n// default stage settings\nconst default_settings = {\n\tcameras: [],\n};\n\n/**\n * a default \"Stage\" object.\n * every \"stage\" object (title screen, credits, ingame, etc...) to be managed\n * through the state manager must inherit from this base class.\n * @see state\n */\nexport default class Stage {\n\t/**\n\t * @param {object} [settings] - The stage` parameters\n\t * @param {Camera2d[]} [settings.cameras=[new me.Camera2d()]] - a list of cameras (experimental)\n\t * @param {Function} [settings.onResetEvent] - called by the state manager when reseting the object\n\t * @param {Function} [settings.onDestroyEvent] - called by the state manager before switching to another state\n\t */\n\tconstructor(settings) {\n\t\t/**\n\t\t * The list of active cameras in this stage.\n\t\t * Cameras will be renderered based on this order defined in this list.\n\t\t * Only the \"default\" camera will be resized when the window or canvas is resized.\n\t\t * @public\n\t\t * @type {Map<Camera2d>}\n\t\t * @name cameras\n\t\t * @memberof Stage\n\t\t */\n\t\tthis.cameras = new Map();\n\n\t\t/**\n\t\t * The list of active lights in this stage.\n\t\t * (Note: Canvas Renderering mode will only properly support one light per stage)\n\t\t * @public\n\t\t * @type {Map<Light2d>}\n\t\t * @name lights\n\t\t * @memberof Stage\n\t\t * @see Light2d\n\t\t * @see Stage.ambientLight\n\t\t * @example\n\t\t * // create a white spot light\n\t\t * let whiteLight = new me.Light2d(0, 0, 140, \"#fff\", 0.7);\n\t\t * // and add the light to this current stage\n\t\t * this.lights.set(\"whiteLight\", whiteLight);\n\t\t * // set a dark ambient light\n\t\t * this.ambientLight.parseCSS(\"#1117\");\n\t\t * // make the light follow the mouse\n\t\t * me.input.registerPointerEvent(\"pointermove\", me.game.viewport, (event) => {\n\t\t * whiteLight.centerOn(event.gameX, event.gameY);\n\t\t * });\n\t\t */\n\t\tthis.lights = new Map();\n\n\t\t/**\n\t\t * an ambient light that will be added to the stage rendering\n\t\t * @public\n\t\t * @type {Color}\n\t\t * @name ambientLight\n\t\t * @memberof Stage\n\t\t * @default \"#000000\"\n\t\t * @see Light2d\n\t\t */\n\t\tthis.ambientLight = new Color(0, 0, 0, 0);\n\n\t\t/**\n\t\t * The given constructor options\n\t\t * @public\n\t\t * @name settings\n\t\t * @memberof Stage\n\t\t * @type {object}\n\t\t */\n\t\tthis.settings = Object.assign(default_settings, settings || {});\n\t}\n\n\t/**\n\t * Object reset function\n\t * @ignore\n\t */\n\treset() {\n\t\t// add all defined cameras\n\t\tthis.settings.cameras.forEach((camera) => {\n\t\t\tthis.cameras.set(camera.name, camera);\n\t\t});\n\n\t\t// empty or no default camera\n\t\tif (this.cameras.has(\"default\") === false) {\n\t\t\tif (typeof default_camera === \"undefined\") {\n\t\t\t\tconst width = renderer.width;\n\t\t\t\tconst height = renderer.height;\n\t\t\t\t// new default camera instance\n\t\t\t\tdefault_camera = new Camera2d(0, 0, width, height);\n\t\t\t}\n\t\t\tthis.cameras.set(\"default\", default_camera);\n\t\t}\n\n\t\t// reset the game\n\t\teventEmitter.emit(STAGE_RESET, this);\n\n\t\t// call the onReset Function\n\t\tthis.onResetEvent.apply(this, arguments);\n\t}\n\n\t/**\n\t * update function\n\t * @name update\n\t * @memberof Stage\n\t * @ignore\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean}\n\t */\n\tupdate(dt) {\n\t\tlet isDirty = false;\n\n\t\t// update the camera/viewport\n\t\t// iterate through all cameras\n\t\tthis.cameras.forEach((camera) => {\n\t\t\tif (camera.update(dt) === true) {\n\t\t\t\tisDirty = true;\n\t\t\t}\n\t\t});\n\n\t\t// update all lights\n\t\tthis.lights.forEach((light) => {\n\t\t\tif (light.update(dt) === true) {\n\t\t\t\tisDirty = true;\n\t\t\t}\n\t\t});\n\n\t\treturn isDirty;\n\t}\n\n\t/**\n\t * draw the current stage\n\t * @name draw\n\t * @memberof Stage\n\t * @ignore\n\t * @param {Renderer} renderer - the renderer object to draw with\n\t * @param {World} world - the world object to draw\n\t */\n\tdraw(renderer, world) {\n\t\t// iterate through all cameras\n\t\tthis.cameras.forEach((camera) => {\n\t\t\t// render the root container\n\t\t\tcamera.draw(renderer, world);\n\n\t\t\t// render the ambient light\n\t\t\tif (this.ambientLight.alpha !== 0) {\n\t\t\t\trenderer.save();\n\t\t\t\t// iterate through all lights\n\t\t\t\tthis.lights.forEach((light) => {\n\t\t\t\t\t// cut out all lights visible areas\n\t\t\t\t\trenderer.setMask(light.getVisibleArea(), true);\n\t\t\t\t});\n\t\t\t\t// fill the screen with the ambient color\n\t\t\t\trenderer.setColor(this.ambientLight);\n\t\t\t\trenderer.fillRect(0, 0, camera.width, camera.height);\n\t\t\t\t// clear all masks\n\t\t\t\trenderer.clearMask();\n\t\t\t\trenderer.restore();\n\t\t\t}\n\n\t\t\t// render all lights\n\t\t\tthis.lights.forEach((light) => {\n\t\t\t\tlight.preDraw(renderer, world);\n\t\t\t\tlight.draw(renderer, world);\n\t\t\t\tlight.postDraw(renderer, world);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// clear all cameras\n\t\tthis.cameras.clear();\n\t\t// clear all lights\n\t\tthis.lights.forEach((light) => {\n\t\t\tlight.destroy();\n\t\t});\n\t\tthis.lights.clear();\n\t\t// notify the object\n\t\tthis.onDestroyEvent.apply(this, arguments);\n\t}\n\n\t/**\n\t * onResetEvent function<br>\n\t * called by the state manager when reseting the object\n\t * this is typically where you will load a level, add renderables, etc...\n\t * @name onResetEvent\n\t * @memberof Stage\n\t * @param {...*} [args] - optional arguments passed when switching state\n\t * @see state#change\n\t */\n\tonResetEvent() {\n\t\t// execute onResetEvent function if given through the constructor\n\t\tif (typeof this.settings.onResetEvent === \"function\") {\n\t\t\tthis.settings.onResetEvent.apply(this, arguments);\n\t\t}\n\t}\n\n\t/**\n\t * onDestroyEvent function<br>\n\t * called by the state manager before switching to another state\n\t * @name onDestroyEvent\n\t * @memberof Stage\n\t */\n\tonDestroyEvent() {\n\t\t// execute onDestroyEvent function if given through the constructor\n\t\tif (typeof this.settings.onDestroyEvent === \"function\") {\n\t\t\tthis.settings.onDestroyEvent.apply(this, arguments);\n\t\t}\n\t}\n}\n", "import { game } from \"../index.js\";\nimport Renderable from \"./../renderable/renderable.js\";\nimport Sprite from \"./../renderable/sprite.js\";\nimport Stage from \"./../state/stage.js\";\nimport {\n\teventEmitter,\n\tLOADER_PROGRESS,\n\tVIEWPORT_ONRESIZE,\n} from \"../system/event.ts\";\nimport { renderer } from \"./../video/video.js\";\nimport { load, unload } from \"./loader.js\";\nimport logo_url from \"./melonjs_logo.png\";\n\n// a basic progress bar object\nclass ProgressBar extends Renderable {\n\t#boundOnProgressUpdate;\n\t#boundResize;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(x, y, w, h) {\n\t\tsuper(x, y, w, h);\n\n\t\tthis.barHeight = h;\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\tthis.#boundOnProgressUpdate = this.onProgressUpdate.bind(this);\n\t\tthis.#boundResize = this.resize.bind(this);\n\n\t\teventEmitter.addListener(LOADER_PROGRESS, this.#boundOnProgressUpdate);\n\t\teventEmitter.addListener(VIEWPORT_ONRESIZE, this.#boundResize);\n\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t// store current progress\n\t\tthis.progress = 0;\n\t}\n\n\t/**\n\t * make sure the screen is refreshed every frame\n\t * @ignore\n\t */\n\tonProgressUpdate(progress) {\n\t\tthis.progress = ~~(progress * this.width);\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * draw function\n\t * @ignore\n\t */\n\tdraw(renderer, viewport) {\n\t\t// draw the progress bar\n\t\trenderer.setColor(\"black\");\n\t\trenderer.fillRect(\n\t\t\tthis.pos.x,\n\t\t\tviewport.centerY,\n\t\t\trenderer.width,\n\t\t\tthis.barHeight / 2,\n\t\t);\n\n\t\trenderer.setColor(\"#55aa00\");\n\t\trenderer.fillRect(\n\t\t\tthis.pos.x,\n\t\t\tviewport.centerY,\n\t\t\tthis.progress,\n\t\t\tthis.barHeight / 2,\n\t\t);\n\t}\n\n\t/**\n\t * Called by engine before deleting the object\n\t * @ignore\n\t */\n\tonDestroyEvent() {\n\t\teventEmitter.removeListener(LOADER_PROGRESS, this.#boundOnProgressUpdate);\n\t\teventEmitter.removeListener(VIEWPORT_ONRESIZE, this.#boundResize);\n\t}\n}\n\n/**\n * a default loading screen\n * @ignore\n */\nclass DefaultLoadingScreen extends Stage {\n\t/**\n\t * call when the loader is resetted\n\t * @ignore\n\t */\n\tonResetEvent() {\n\t\tconst barHeight = 8;\n\n\t\t// set a background color\n\t\tgame.world.backgroundColor.parseCSS(\"#202020\");\n\n\t\t// progress bar\n\t\tgame.world.addChild(\n\t\t\tnew ProgressBar(0, renderer.height / 2, renderer.width, barHeight),\n\t\t\t1,\n\t\t);\n\n\t\t// load the melonJS logo\n\t\tload({ name: \"melonjs_logo\", type: \"image\", src: logo_url }, () => {\n\t\t\t// melonJS logo\n\t\t\tgame.world.addChild(\n\t\t\t\tnew Sprite(renderer.width / 2, renderer.height / 2, {\n\t\t\t\t\timage: \"melonjs_logo\",\n\t\t\t\t\tframewidth: 256,\n\t\t\t\t\tframeheight: 256,\n\t\t\t\t}),\n\t\t\t\t2,\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Called by engine before deleting the object\n\t * @ignore\n\t */\n\tonDestroyEvent() {\n\t\t// cancel the callback\n\t\tunload({ name: \"melonjs_logo\", type: \"image\" });\n\t}\n}\n\nexport default DefaultLoadingScreen;\n", "import { pauseTrack, resumeTrack } from \"./../audio/audio.js\";\nimport { game } from \"../index.js\";\nimport DefaultLoadingScreen from \"./../loader/loadingscreen.js\";\nimport Stage from \"./../state/stage.js\";\nimport {\n\tBOOT,\n\teventEmitter,\n\tSTATE_CHANGE,\n\tSTATE_PAUSE,\n\tSTATE_RESTART,\n\tSTATE_RESUME,\n\tSTATE_STOP,\n\tTICK,\n\tVIDEO_INIT,\n} from \"../system/event.ts\";\nimport { defer } from \"../utils/function.ts\";\n\n// current state\nlet _state = -1;\n\n// requestAnimeFrame Id\nlet _animFrameId = -1;\n\n// whether the game state is \"paused\"\nlet _isPaused = false;\n\n// list of stages\nconst _stages = {};\n\n// fading transition parameters between screen\nconst _fade = {\n\tcolor: \"\",\n\tduration: 0,\n};\n\n// callback when state switch is done\n/** @ignore */\nlet _onSwitchComplete = null;\n\n// just to keep track of possible extra arguments\nlet _extraArgs = null;\n\n// store the elapsed time during pause/stop period\nlet _pauseTime = 0;\n\n/**\n * @ignore\n */\nfunction _startRunLoop() {\n\t// ensure nothing is running first and in valid state\n\tif (_animFrameId === -1 && _state !== -1) {\n\t\t// start the main loop\n\t\t_animFrameId = globalThis.requestAnimationFrame(_renderFrame);\n\t}\n}\n\n/**\n * Resume the game loop after a pause.\n * @ignore\n */\nfunction _resumeRunLoop() {\n\t// ensure game is actually paused and in valid state\n\tif (_isPaused && _state !== -1) {\n\t\t_isPaused = false;\n\t}\n}\n\n/**\n * Pause the loop for most stage objects.\n * @ignore\n */\nfunction _pauseRunLoop() {\n\t// Set the paused boolean to stop updates on (most) entities\n\t_isPaused = true;\n}\n\n/**\n * this is only called when using requestAnimFrame stuff\n * @param {number} time - current timestamp in milliseconds\n * @ignore\n */\nfunction _renderFrame(time) {\n\teventEmitter.emit(TICK, time);\n\t// schedule the next frame update\n\tif (_animFrameId !== -1) {\n\t\t_animFrameId = globalThis.requestAnimationFrame(_renderFrame);\n\t}\n}\n\n/**\n * stop the SO main loop\n * @ignore\n */\nfunction _stopRunLoop() {\n\t// cancel any previous animationRequestFrame\n\tglobalThis.cancelAnimationFrame(_animFrameId);\n\t_animFrameId = -1;\n}\n\n/**\n * start the SO main loop\n * @ignore\n */\nfunction _switchState(state) {\n\t// clear previous interval if any\n\t_stopRunLoop();\n\n\t// call the stage destroy method\n\tif (_stages[_state]) {\n\t\t// just notify the object\n\t\t_stages[_state].stage.destroy();\n\t}\n\n\tif (_stages[state]) {\n\t\t// set the global variable\n\t\t_state = state;\n\n\t\t// call the reset function with _extraArgs as arguments\n\t\t_stages[_state].stage.reset.apply(_stages[_state].stage, _extraArgs);\n\n\t\t// and start the main loop of the\n\t\t// new requested state\n\t\t_startRunLoop();\n\n\t\t// publish the pause event\n\t\teventEmitter.emit(STATE_CHANGE);\n\n\t\t// execute callback if defined\n\t\tif (_onSwitchComplete) {\n\t\t\t_onSwitchComplete();\n\t\t}\n\t}\n}\n\n// initialize me.state on system boot\neventEmitter.addListenerOnce(BOOT, () => {\n\t// set the built-in loading stage\n\tstate.set(state.LOADING, new DefaultLoadingScreen());\n\t// set and enable the default stage\n\tstate.set(state.DEFAULT, new Stage());\n\t// enable by default as soon as the display is initialized\n\teventEmitter.addListenerOnce(VIDEO_INIT, () => {\n\t\tstate.change(state.DEFAULT, true);\n\t});\n});\n\n/**\n * a State Manager (state machine)\n * @namespace state\n */\nconst state = {\n\t/**\n\t * default state ID for Loading Stage\n\t * @constant\n\t * @name LOADING\n\t * @memberof state\n\t */\n\tLOADING: 0,\n\n\t/**\n\t * default state ID for Menu Stage\n\t * @constant\n\t * @name MENU\n\t * @memberof state\n\t */\n\tMENU: 1,\n\n\t/**\n\t * default state ID for \"Ready\" Stage\n\t * @constant\n\t * @name READY\n\t * @memberof state\n\t */\n\tREADY: 2,\n\n\t/**\n\t * default state ID for Play Stage\n\t * @constant\n\t * @name PLAY\n\t * @memberof state\n\t */\n\tPLAY: 3,\n\n\t/**\n\t * default state ID for Game Over Stage\n\t * @constant\n\t * @name GAMEOVER\n\t * @memberof state\n\t */\n\tGAMEOVER: 4,\n\n\t/**\n\t * default state ID for Game End Stage\n\t * @constant\n\t * @name GAME_END\n\t * @memberof state\n\t */\n\tGAME_END: 5,\n\n\t/**\n\t * default state ID for High Score Stage\n\t * @constant\n\t * @name SCORE\n\t * @memberof state\n\t */\n\tSCORE: 6,\n\n\t/**\n\t * default state ID for Credits Stage\n\t * @constant\n\t * @name CREDITS\n\t * @memberof state\n\t */\n\tCREDITS: 7,\n\n\t/**\n\t * default state ID for Settings Stage\n\t * @constant\n\t * @name SETTINGS\n\t * @memberof state\n\t */\n\tSETTINGS: 8,\n\n\t/**\n\t * default state ID for the default Stage\n\t * (the default stage is the one running as soon as melonJS is started)\n\t * @constant\n\t * @name DEFAULT\n\t * @memberof state\n\t */\n\tDEFAULT: 9,\n\n\t/**\n\t * default state ID for user defined constants<br>\n\t * @constant\n\t * @name USER\n\t * @memberof state\n\t * @example\n\t * let STATE_INFO = me.state.USER + 0;\n\t * let STATE_WARN = me.state.USER + 1;\n\t * let STATE_ERROR = me.state.USER + 2;\n\t * let STATE_CUTSCENE = me.state.USER + 3;\n\t */\n\tUSER: 100,\n\n\t/**\n\t * Stop the current stage.\n\t * @name stop\n\t * @memberof state\n\t * @public\n\t * @param {boolean} [pauseTrack=false] - pause current track on screen stop.\n\t */\n\tstop(pauseTrack = false) {\n\t\t// only stop when we are not loading stuff\n\t\tif (_state !== this.LOADING && this.isRunning()) {\n\t\t\t// stop the main loop\n\t\t\t_stopRunLoop();\n\n\t\t\t// current music stop\n\t\t\tif (pauseTrack === true) {\n\t\t\t\tpauseTrack();\n\t\t\t}\n\n\t\t\t// store time when stopped\n\t\t\t_pauseTime = globalThis.performance.now();\n\n\t\t\t// publish the stop notification\n\t\t\teventEmitter.emit(STATE_STOP);\n\t\t}\n\t},\n\n\t/**\n\t * pause the current stage\n\t * @name pause\n\t * @memberof state\n\t * @public\n\t * @param {boolean} [music=false] - pause current music track on screen pause\n\t */\n\tpause(music = false) {\n\t\t// only pause when we are not loading stuff\n\t\tif (_state !== this.LOADING && !this.isPaused()) {\n\t\t\t// stop the main loop\n\t\t\t_pauseRunLoop();\n\t\t\t// current music stop\n\t\t\tif (music === true) {\n\t\t\t\tpauseTrack();\n\t\t\t}\n\n\t\t\t// store time when paused\n\t\t\t_pauseTime = globalThis.performance.now();\n\n\t\t\t// publish the pause event\n\t\t\teventEmitter.emit(STATE_PAUSE);\n\t\t}\n\t},\n\n\t/**\n\t * Restart the current stage from a full stop.\n\t * @name restart\n\t * @memberof state\n\t * @public\n\t * @param {boolean} [music=false] - resume current music track on screen resume\n\t */\n\trestart(music = false) {\n\t\tif (!this.isRunning()) {\n\t\t\t// restart the main loop\n\t\t\t_startRunLoop();\n\t\t\t// current music stop\n\t\t\tif (music === true) {\n\t\t\t\tresumeTrack();\n\t\t\t}\n\n\t\t\t// calculate the elpased time\n\t\t\t_pauseTime = globalThis.performance.now() - _pauseTime;\n\n\t\t\t// publish the restart notification\n\t\t\teventEmitter.emit(STATE_RESTART, _pauseTime);\n\t\t}\n\t},\n\n\t/**\n\t * resume the current stage\n\t * @name resume\n\t * @memberof state\n\t * @public\n\t * @param {boolean} [music=false] - resume current music track on screen resume\n\t */\n\tresume(music = false) {\n\t\tif (this.isPaused()) {\n\t\t\t// resume the main loop\n\t\t\t_resumeRunLoop();\n\t\t\t// current music stop\n\t\t\tif (music === true) {\n\t\t\t\tresumeTrack();\n\t\t\t}\n\n\t\t\t// calculate the elpased time\n\t\t\t_pauseTime = globalThis.performance.now() - _pauseTime;\n\n\t\t\t// publish the resume event\n\t\t\teventEmitter.emit(STATE_RESUME, _pauseTime);\n\t\t}\n\t},\n\n\t/**\n\t * return the running state of the state manager\n\t * @name isRunning\n\t * @memberof state\n\t * @public\n\t * @returns {boolean} true if a \"process is running\"\n\t */\n\tisRunning() {\n\t\treturn _animFrameId !== -1;\n\t},\n\n\t/**\n\t * Return the pause state of the state manager\n\t * @name isPaused\n\t * @memberof state\n\t * @public\n\t * @returns {boolean} true if the game is paused\n\t */\n\tisPaused() {\n\t\treturn _isPaused;\n\t},\n\n\t/**\n\t * associate the specified state with a Stage\n\t * @name set\n\t * @memberof state\n\t * @public\n\t * @param {number} state - State ID (see constants)\n\t * @param {Stage} stage - Instantiated Stage to associate with state ID\n\t * @param {boolean} [start = false] - if true the state will be changed immediately after adding it.\n\t * @example\n\t * class MenuButton extends me.GUI_Object {\n\t * onClick() {\n\t * // Change to the PLAY state when the button is clicked\n\t * me.state.change(me.state.PLAY);\n\t * return true;\n\t * }\n\t * };\n\t *\n\t * class MenuScreen extends me.Stage {\n\t * onResetEvent() {\n\t * // Load background image\n\t * me.game.world.addChild(\n\t * new me.ImageLayer(0, 0, {\n\t * image : \"bg\",\n\t * z: 0 // z-index\n\t * }\n\t * );\n\t *\n\t * // Add a button\n\t * me.game.world.addChild(\n\t * new MenuButton(350, 200, { \"image\" : \"start\" }),\n\t * 1 // z-index\n\t * );\n\t *\n\t * // Play music\n\t * me.audio.playTrack(\"menu\");\n\t * }\n\t *\n\t * onDestroyEvent() {\n\t * // Stop music\n\t * me.audio.stopTrack();\n\t * }\n\t * };\n\t *\n\t * me.state.set(me.state.MENU, new MenuScreen());\n\t */\n\tset(state, stage, start = false) {\n\t\tif (!(stage instanceof Stage)) {\n\t\t\tthrow new Error(stage + \" is not an instance of me.Stage\");\n\t\t}\n\t\t_stages[state] = {};\n\t\t_stages[state].stage = stage;\n\t\t_stages[state].transition = true;\n\n\t\tif (start === true) {\n\t\t\tthis.change(state);\n\t\t}\n\t},\n\n\t/**\n\t * returns the stage associated with the specified state\n\t * (or the current one if none is specified)\n\t * @name set\n\t * @memberof state\n\t * @public\n\t * @param {number} [state] - State ID (see constants)\n\t * @returns {Stage}\n\t */\n\tget(state = _state) {\n\t\tif (typeof _stages[state] !== \"undefined\") {\n\t\t\treturn _stages[state].stage;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t},\n\n\t/**\n\t * return a reference to the current stage<br>\n\t * useful to call a object specific method\n\t * @name current\n\t * @memberof state\n\t * @public\n\t * @returns {Stage}\n\t */\n\tcurrent() {\n\t\treturn this.get();\n\t},\n\n\t/**\n\t * specify a global transition effect\n\t * @name transition\n\t * @memberof state\n\t * @public\n\t * @param {string} effect - (only \"fade\" is supported for now)\n\t * @param {Color|string} color - a CSS color value\n\t * @param {number} [duration=1000] - expressed in milliseconds\n\t */\n\ttransition(effect, color, duration) {\n\t\tif (effect === \"fade\") {\n\t\t\t_fade.color = color;\n\t\t\t_fade.duration = duration;\n\t\t}\n\t},\n\n\t/**\n\t * enable/disable the transition to a particular state (by default enabled for all)\n\t * @name setTransition\n\t * @memberof state\n\t * @public\n\t * @param {number} state - State ID (see constants)\n\t * @param {boolean} enable\n\t */\n\tsetTransition(state, enable) {\n\t\t_stages[state].transition = enable;\n\t},\n\n\t/**\n\t * change the game/app state\n\t * @name change\n\t * @memberof state\n\t * @public\n\t * @param {number} state - State ID (see constants)\n\t * @param {boolean} [forceChange=false] - if true the state will be changed immediately (without waiting for the next frame)\n\t * @param {...*} [args] - extra arguments to be passed to the reset functions\n\t * @example\n\t * // The onResetEvent method on the play screen will receive two args:\n\t * // \"level_1\" and the number 3\n\t * me.state.change(me.state.PLAY, \"level_1\", 3);\n\t */\n\tchange(state, forceChange = false) {\n\t\t// Protect against undefined Stage\n\t\tif (typeof _stages[state] === \"undefined\") {\n\t\t\tthrow new Error(\"Undefined Stage for state '\" + state + \"'\");\n\t\t}\n\n\t\t// do nothing if already the current state\n\t\tif (!this.isCurrent(state)) {\n\t\t\t_extraArgs = null;\n\t\t\tif (arguments.length > 1) {\n\t\t\t\t// store extra arguments if any\n\t\t\t\t_extraArgs = Array.prototype.slice.call(arguments, 1);\n\t\t\t}\n\t\t\t// if fading effect\n\t\t\tif (_fade.duration && _stages[state].transition) {\n\t\t\t\t_onSwitchComplete = () => {\n\t\t\t\t\tgame.viewport.fadeOut(_fade.color, _fade.duration);\n\t\t\t\t};\n\t\t\t\tgame.viewport.fadeIn(_fade.color, _fade.duration, function () {\n\t\t\t\t\tdefer(_switchState, this, state);\n\t\t\t\t});\n\t\t\t}\n\t\t\t// else just switch without any effects\n\t\t\telse {\n\t\t\t\t// wait for the last frame to be\n\t\t\t\t// \"finished\" before switching\n\t\t\t\tif (forceChange === true) {\n\t\t\t\t\t_switchState(state);\n\t\t\t\t} else {\n\t\t\t\t\tdefer(_switchState, this, state);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * return true if the specified state is the current one\n\t * @name isCurrent\n\t * @memberof state\n\t * @public\n\t * @param {number} state - State ID (see constants)\n\t * @returns {boolean} true if the specified state is the current one\n\t */\n\tisCurrent(state) {\n\t\treturn _state === state;\n\t},\n};\nexport default state;\n", "import { clamp } from \"../math/math.js\";\nimport state from \"../state/state.js\";\nimport { defer } from \"./../utils/function.js\";\nimport {\n\tBOOT,\n\teventEmitter,\n\tGAME_BEFORE_UPDATE,\n\tSTATE_CHANGE,\n\tSTATE_RESTART,\n\tSTATE_RESUME,\n} from \"./event.js\";\n\n/**\n * a Timer class to manage timing related function (FPS, Game Tick, Time...)\n * @see {@link timer} the default global timer instance\n */\nclass Timer {\n\ttick: number;\n\tfps: number;\n\tmaxfps: number;\n\tinterpolation: boolean;\n\tframecount: number;\n\tframedelta: number;\n\tlast: number;\n\tnow: number;\n\tdelta: number;\n\tstep: number;\n\tminstep: number;\n\ttimers: {\n\t\tfn: (...args: any[]) => any;\n\t\tdelay: number;\n\t\telapsed: number;\n\t\trepeat: boolean;\n\t\ttimerId: number;\n\t\tpauseable: boolean;\n\t\targs: any[];\n\t}[];\n\ttimerId: number;\n\n\tconstructor() {\n\t\t/**\n\t\t * Last game tick value. <br>\n\t\t * Use this value to scale velocities during frame drops due to slow hardware or when setting an FPS limit.\n\t\t * This feature is disabled by default (Enable interpolation to use it).\n\t\t * @see interpolation\n\t\t */\n\t\tthis.tick = 1.0;\n\n\t\t/**\n\t\t * Last measured fps rate.<br>\n\t\t * This feature is disabled by default, unless the debugPanel is enabled/visible.\n\t\t */\n\t\tthis.fps = 0;\n\n\t\t/**\n\t\t * Set the maximum target display frame per second\n\t\t * @see tick\n\t\t * @default 60\n\t\t */\n\t\tthis.maxfps = 60;\n\n\t\t/**\n\t\t * Enable/disable frame interpolation\n\t\t * @see tick\n\t\t * @default false\n\t\t */\n\t\tthis.interpolation = false;\n\n\t\t//hold element to display fps\n\t\tthis.framecount = 0;\n\t\tthis.framedelta = 0;\n\n\t\t/* fps count stuff */\n\t\tthis.last = 0;\n\t\tthis.now = 0;\n\t\tthis.delta = 0;\n\t\t// for timeout/interval update\n\t\tthis.step = 0;\n\t\tthis.minstep = 0;\n\n\t\t// list of defined timer function\n\t\tthis.timers = [];\n\t\tthis.timerId = 0;\n\n\t\t// Initialize timer on Boot event\n\t\teventEmitter.addListenerOnce(BOOT, () => {\n\t\t\t// reset variables to initial state\n\t\t\tthis.reset();\n\t\t\tthis.now = this.last = 0;\n\t\t\t// register to the game before update event\n\t\t\teventEmitter.addListener(GAME_BEFORE_UPDATE, (time) => {\n\t\t\t\tthis.update(time);\n\t\t\t});\n\t\t});\n\n\t\t// reset timer\n\t\teventEmitter.addListener(STATE_RESUME, () => {\n\t\t\tthis.reset();\n\t\t});\n\t\teventEmitter.addListener(STATE_RESTART, () => {\n\t\t\tthis.reset();\n\t\t});\n\t\teventEmitter.addListener(STATE_CHANGE, () => {\n\t\t\tthis.reset();\n\t\t});\n\t}\n\n\t/**\n\t * reset time (e.g. usefull in case of pause)\n\t * @ignore\n\t */\n\treset() {\n\t\t// set to \"now\"\n\t\tthis.last = this.now = globalThis.performance.now();\n\t\tthis.delta = 0;\n\t\t// reset delta counting variables\n\t\tthis.framedelta = 0;\n\t\tthis.framecount = 0;\n\t\tthis.step = Math.ceil(1000 / this.maxfps); // ROUND IT ?\n\t\t// define some step with some margin\n\t\tthis.minstep = (1000 / this.maxfps) * 1.25; // IS IT NECESSARY?\\\n\t}\n\n\t/**\n\t * Calls a function once after a specified delay. See me.timer.setInterval to repeativly call a function.\n\t * @param fn - the function you want to execute after delay milliseconds.\n\t * @param delay - the number of milliseconds (thousandths of a second) that the function call should be delayed by.\n\t * @param [pauseable] - respects the pause state of the engine.\n\t * @param args - optional parameters which are passed through to the function specified by fn once the timer expires.\n\t * @returns a positive integer value which identifies the timer created by the call to setTimeout(), which can be used later with me.timer.clearTimeout().\n\t * @example\n\t * // set a timer to call \"myFunction\" after 1000ms\n\t * me.timer.setTimeout(myFunction, 1000);\n\t * // set a timer to call \"myFunction\" after 1000ms (respecting the pause state) and passing param1 and param2\n\t * me.timer.setTimeout(myFunction, 1000, true, param1, param2);\n\t */\n\tsetTimeout(\n\t\tfn: (...args: any[]) => any,\n\t\tdelay: number,\n\t\tpauseable?: boolean,\n\t\t...args: any[]\n\t) {\n\t\tthis.timers.push({\n\t\t\tfn: fn,\n\t\t\tdelay: delay,\n\t\t\telapsed: 0,\n\t\t\trepeat: false,\n\t\t\ttimerId: ++this.timerId,\n\t\t\tpauseable: pauseable ?? true,\n\t\t\targs: args,\n\t\t});\n\t\treturn this.timerId;\n\t}\n\n\t/**\n\t * Calls a function continously at the specified interval. See setTimeout to call function a single time.\n\t * @param fn - the function to execute\n\t * @param delay - the number of milliseconds (thousandths of a second) on how often to execute the function\n\t * @param [pauseable] - respects the pause state of the engine.\n\t * @param args - optional parameters which are passed through to the function specified by fn once the timer expires.\n\t * @returns a numeric, non-zero value which identifies the timer created by the call to setInterval(), which can be used later with me.timer.clearInterval().\n\t * @example\n\t * // set a timer to call \"myFunction\" every 1000ms\n\t * me.timer.setInterval(myFunction, 1000);\n\t * // set a timer to call \"myFunction\" every 1000ms (respecting the pause state) and passing param1 and param2\n\t * me.timer.setInterval(myFunction, 1000, true, param1, param2);\n\t */\n\tsetInterval(\n\t\tfn: (...args: any[]) => any,\n\t\tdelay: number,\n\t\tpauseable?: boolean,\n\t\t...args: any[]\n\t) {\n\t\tthis.timers.push({\n\t\t\tfn: fn,\n\t\t\tdelay: delay,\n\t\t\telapsed: 0,\n\t\t\trepeat: true,\n\t\t\ttimerId: ++this.timerId,\n\t\t\tpauseable: pauseable === true || true,\n\t\t\targs: args,\n\t\t});\n\t\treturn this.timerId;\n\t}\n\n\t/**\n\t * Cancels a timeout previously established by calling setTimeout().\n\t * @param timeoutID - ID of the timeout to be cancelled\n\t */\n\tclearTimeout(timeoutID: number) {\n\t\tif (timeoutID > 0) {\n\t\t\tdefer(() => {\n\t\t\t\tthis.clearTimer(timeoutID);\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * cancels the timed, repeating action which was previously established by a call to setInterval().\n\t * @param intervalID - ID of the interval to be cleared\n\t */\n\tclearInterval(intervalID: number) {\n\t\tif (intervalID > 0) {\n\t\t\tdefer(() => {\n\t\t\t\tthis.clearTimer(intervalID);\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Return the current timestamp in milliseconds <br>\n\t * since the game has started or since linux epoch (based on browser support for High Resolution Timer)\n\t * @returns current time\n\t */\n\tgetTime() {\n\t\treturn this.now;\n\t}\n\n\t/**\n\t * Return elapsed time in milliseconds since the last update\n\t * @returns elapsed time\n\t */\n\tgetDelta() {\n\t\treturn this.delta;\n\t}\n\n\t/**\n\t * compute the actual frame time and fps rate\n\t * @ignore\n\t */\n\tcountFPS() {\n\t\tthis.framecount++;\n\t\tthis.framedelta += this.delta;\n\t\tif (this.framecount % 10 === 0) {\n\t\t\tthis.fps = clamp(\n\t\t\t\tMath.round((1000 * this.framecount) / this.framedelta),\n\t\t\t\t0,\n\t\t\t\tthis.maxfps,\n\t\t\t);\n\t\t\tthis.framedelta = 0;\n\t\t\tthis.framecount = 0;\n\t\t}\n\t}\n\n\t/**\n\t * update\n\t * @ignore\n\t */\n\tupdate(time: number) {\n\t\tthis.last = this.now;\n\t\tthis.now = time;\n\t\tthis.delta = this.now - this.last;\n\n\t\t// fix for negative timestamp returned by wechat or chrome on startup\n\t\tif (this.delta < 0) {\n\t\t\tthis.delta = 0;\n\t\t}\n\n\t\t// get the game tick\n\t\tthis.tick =\n\t\t\tthis.delta > this.minstep && this.interpolation\n\t\t\t\t? this.delta / this.step\n\t\t\t\t: 1;\n\n\t\tthis.updateTimers();\n\t}\n\n\t/**\n\t * clear Timers\n\t * @ignore\n\t */\n\tclearTimer(timerId: number) {\n\t\tfor (let i = 0; i < this.timers.length; i++) {\n\t\t\tif (this.timers[i].timerId === timerId) {\n\t\t\t\tthis.timers.splice(i, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * update timers\n\t * @ignore\n\t */\n\tupdateTimers() {\n\t\tfor (const timer of this.timers) {\n\t\t\tif (!(timer.pauseable && state.isPaused())) {\n\t\t\t\ttimer.elapsed += this.delta;\n\t\t\t}\n\t\t\tif (timer.elapsed >= timer.delay) {\n\t\t\t\ttimer.fn(...timer.args);\n\n\t\t\t\tif (timer.repeat) {\n\t\t\t\t\ttimer.elapsed -= timer.delay;\n\t\t\t\t} else {\n\t\t\t\t\tthis.clearTimer(timer.timerId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst timer = new Timer();\n\n/**\n * the default global Timer instance\n * @see Timer\n * @example\n * // set a timer to call \"myFunction\" after 1000ms\n * timer.setTimeout(myFunction, 1000);\n * // set a timer to call \"myFunction\" after 1000ms (respecting the pause state) and passing param1 and param2\n * timer.setTimeout(myFunction, 1000, true, param1, param2);\n * // set a timer to call \"myFunction\" every 1000ms\n * timer.setInterval(myFunction, 1000);\n * // set a timer to call \"myFunction\" every 1000ms (respecting the pause state) and passing param1 and param2\n * timer.setInterval(myFunction, 1000, true, param1, param2);\n */\nexport default timer;\n", "import { game } from \"../index.js\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport { Bounds } from \"./../physics/bounds.ts\";\nimport { globalToLocal } from \"./input.js\";\nimport { locked } from \"./pointerevent.js\";\n\n/**\n * a temporary vector object\n * @ignore\n */\nconst tmpVec = new Vector2d();\n\n/**\n * a pointer object, representing a single finger on a touch enabled device.\n */\nclass Pointer extends Bounds {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(x = 0, y = 0, w = 1, h = 1) {\n\t\t// parent constructor\n\t\tsuper();\n\n\t\t// initial coordinates/size\n\t\tthis.setMinMax(x, y, x + w, y + h);\n\n\t\t/**\n\t\t * constant for left button\n\t\t * @public\n\t\t * @type {number}\n\t\t */\n\t\tthis.LEFT = 0;\n\n\t\t/**\n\t\t * constant for middle button\n\t\t * @public\n\t\t * @type {number}\n\t\t */\n\t\tthis.MIDDLE = 1;\n\n\t\t/**\n\t\t * constant for right button\n\t\t * @public\n\t\t * @type {number}\n\t\t */\n\t\tthis.RIGHT = 2;\n\n\t\t/**\n\t\t * the originating Event Object\n\t\t * @type {PointerEvent|TouchEvent|MouseEvent}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent}\n\t\t */\n\t\tthis.event = undefined;\n\n\t\t/**\n\t\t * a string containing the event's type.\n\t\t * @type {string}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Event/type}\n\t\t */\n\t\tthis.type = undefined;\n\n\t\t/**\n\t\t * the button property indicates which button was pressed on the mouse to trigger the event.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button}\n\t\t */\n\t\tthis.button = 0;\n\n\t\t/**\n\t\t * indicates whether or not the pointer device that created the event is the primary pointer.\n\t\t * @type {boolean}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary}\n\t\t */\n\t\tthis.isPrimary = false;\n\n\t\t/**\n\t\t * the horizontal coordinate at which the event occurred, relative to the left edge of the entire document.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageX}\n\t\t */\n\t\tthis.pageX = 0;\n\n\t\t/**\n\t\t * the vertical coordinate at which the event occurred, relative to the left edge of the entire document.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY}\n\t\t */\n\t\tthis.pageY = 0;\n\n\t\t/**\n\t\t * the horizontal coordinate within the application's client area at which the event occurred\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX}\n\t\t */\n\t\tthis.clientX = 0;\n\n\t\t/**\n\t\t * the vertical coordinate within the application's client area at which the event occurred\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY}\n\t\t */\n\t\tthis.clientY = 0;\n\n\t\t/**\n\t\t * the difference in the X coordinate of the pointer since the previous move event\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX}\n\t\t */\n\t\tthis.movementX = 0;\n\n\t\t/**\n\t\t * the difference in the Y coordinate of the pointer since the previous move event\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementY}\n\t\t */\n\t\tthis.movementY = 0;\n\n\t\t/**\n\t\t * an unsigned long representing the unit of the delta values scroll amount\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode}\n\t\t */\n\t\tthis.deltaMode = 0;\n\n\t\t/**\n\t\t * a double representing the horizontal scroll amount in the Wheel Event deltaMode unit.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaX}\n\t\t */\n\t\tthis.deltaX = 0;\n\n\t\t/**\n\t\t * a double representing the vertical scroll amount in the Wheel Event deltaMode unit.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaY}\n\t\t */\n\t\tthis.deltaY = 0;\n\n\t\t/**\n\t\t * a double representing the scroll amount in the z-axis, in the Wheel Event deltaMode unit.\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaZ}\n\t\t */\n\t\tthis.deltaZ = 0;\n\n\t\t/**\n\t\t * Event normalized X coordinate within the game canvas itself<br>\n\t\t * <img src=\"images/event_coord.png\"/>\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameX = 0;\n\n\t\t/**\n\t\t * Event normalized Y coordinate within the game canvas itself<br>\n\t\t * <img src=\"images/event_coord.png\"/>\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameY = 0;\n\n\t\t/**\n\t\t * Event X coordinate relative to the viewport\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameScreenX = 0;\n\n\t\t/**\n\t\t * Event Y coordinate relative to the viewport\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameScreenY = 0;\n\n\t\t/**\n\t\t * Event X coordinate relative to the map\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameWorldX = 0;\n\n\t\t/**\n\t\t * Event Y coordinate relative to the map\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameWorldY = 0;\n\n\t\t/**\n\t\t * Event X coordinate relative to the holding container\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameLocalX = 0;\n\n\t\t/**\n\t\t * Event Y coordinate relative to the holding container\n\t\t * @type {number}\n\t\t */\n\t\tthis.gameLocalY = 0;\n\n\t\t/**\n\t\t * The unique identifier of the contact for a touch, mouse or pen\n\t\t * @type {number}\n\t\t * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId}\n\t\t */\n\t\tthis.pointerId = undefined;\n\n\t\t/**\n\t\t * true if not originally a pointer event\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.isNormalized = false;\n\n\t\t/**\n\t\t * true if the pointer is currently locked\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.locked = false;\n\n\t\t// bind list for mouse buttons\n\t\tthis.bind = [0, 0, 0];\n\t}\n\n\t/**\n\t * initialize the Pointer object using the given Event Object\n\t * @private\n\t * @param {Event} event - the original Event object\n\t * @param {number} [pageX=0] - the horizontal coordinate at which the event occurred, relative to the left edge of the entire document\n\t * @param {number} [pageY=0] - the vertical coordinate at which the event occurred, relative to the left edge of the entire document\n\t * @param {number} [clientX=0] - the horizontal coordinate within the application's client area at which the event occurred\n\t * @param {number} [clientY=0] - the vertical coordinate within the application's client area at which the event occurred\n\t * @param {number} [pointerId=1] - the Pointer, Touch or Mouse event Id (1)\n\t */\n\tsetEvent(\n\t\tevent,\n\t\tpageX = 0,\n\t\tpageY = 0,\n\t\tclientX = 0,\n\t\tclientY = 0,\n\t\tpointerId = 1,\n\t) {\n\t\t// the original event object\n\t\tthis.event = event;\n\n\t\tthis.pageX = pageX;\n\t\tthis.pageY = pageY;\n\t\tthis.clientX = clientX;\n\t\tthis.clientY = clientY;\n\n\t\t// translate to local coordinates\n\t\tglobalToLocal(this.pageX, this.pageY, tmpVec);\n\t\tthis.gameScreenX = this.x = tmpVec.x;\n\t\tthis.gameScreenY = this.y = tmpVec.y;\n\n\t\t// true if not originally a pointer event\n\t\tthis.isNormalized =\n\t\t\ttypeof globalThis.PointerEvent !== \"undefined\" &&\n\t\t\t!(event instanceof globalThis.PointerEvent);\n\n\t\tthis.locked = locked;\n\t\tthis.movementX = event.movementX || 0;\n\t\tthis.movementY = event.movementY || 0;\n\n\t\tif (event.type === \"wheel\") {\n\t\t\tthis.deltaMode = event.deltaMode || 0;\n\t\t\tthis.deltaX = event.deltaX || 0;\n\t\t\tthis.deltaY = event.deltaY || 0;\n\t\t\tthis.deltaZ = event.deltaZ || 0;\n\t\t} else {\n\t\t\tthis.deltaMode = 0;\n\t\t\tthis.deltaX = 0;\n\t\t\tthis.deltaY = 0;\n\t\t\tthis.deltaZ = 0;\n\t\t}\n\n\t\tthis.pointerId = pointerId;\n\n\t\tthis.isPrimary =\n\t\t\ttypeof event.isPrimary !== \"undefined\" ? event.isPrimary : true;\n\n\t\t// in case of touch events, button is not defined\n\t\tthis.button = event.button || 0;\n\n\t\tthis.type = event.type;\n\n\t\t// get the current screen to game world offset\n\t\tif (typeof game.viewport !== \"undefined\") {\n\t\t\tgame.viewport.localToWorld(this.gameScreenX, this.gameScreenY, tmpVec);\n\t\t}\n\n\t\t/* Initialize the two coordinate space properties. */\n\t\tthis.gameWorldX = tmpVec.x;\n\t\tthis.gameWorldY = tmpVec.y;\n\n\t\t// get the pointer size\n\t\tif (this.isNormalized === false) {\n\t\t\t// native PointerEvent\n\t\t\tthis.width = event.width || 1;\n\t\t\tthis.height = event.height || 1;\n\t\t} else if (typeof event.radiusX === \"number\") {\n\t\t\t// TouchEvent\n\t\t\tthis.width = event.radiusX * 2 || 1;\n\t\t\tthis.height = event.radiusY * 2 || 1;\n\t\t} else {\n\t\t\tthis.width = this.height = 1;\n\t\t}\n\t}\n}\n\nexport default Pointer;\n", "import { Rect } from \"./../geometries/rectangle.ts\";\nimport { game } from \"../index.js\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport * as device from \"./../system/device.js\";\nimport {\n\teventEmitter,\n\tPOINTERLOCKCHANGE,\n\tPOINTERMOVE,\n} from \"../system/event.ts\";\nimport timer from \"./../system/timer.ts\";\nimport { remove } from \"./../utils/array.ts\";\nimport { throttle } from \"./../utils/function.ts\";\nimport { renderer } from \"./../video/video.js\";\nimport { preventDefault } from \"./input.js\";\nimport { getBindingKey, triggerKeyEvent } from \"./keyboard.ts\";\nimport Pointer from \"./pointer.js\";\n\n/**\n * @import {Vector2d} from \"../math/vector2d.js\";\n */\n\n/**\n * A pool of `Pointer` objects to cache pointer/touch event coordinates.\n * @type {Array.<Vector2d>}\n * @ignore\n */\nconst T_POINTERS = [];\n\n// list of registered Event handlers\nconst eventHandlers = new Map();\n\n// a cache rect represeting the current pointer area\nlet currentPointer;\n\n// some useful flags\nlet pointerInitialized = false;\n\n// Track last event timestamp to prevent firing events out of order\nlet lastTimeStamp = 0;\n\n// \"active\" list of supported events\nlet activeEventList = [];\n\n// internal constants\nconst WHEEL = [\"wheel\"];\nconst POINTER_MOVE = [\"pointermove\", \"mousemove\", \"touchmove\"];\nconst POINTER_DOWN = [\"pointerdown\", \"mousedown\", \"touchstart\"];\nconst POINTER_UP = [\"pointerup\", \"mouseup\", \"touchend\"];\nconst POINTER_CANCEL = [\"pointercancel\", \"mousecancel\", \"touchcancel\"];\nconst POINTER_ENTER = [\"pointerenter\", \"mouseenter\", \"touchenter\"];\nconst POINTER_OVER = [\"pointerover\", \"mouseover\", \"touchover\"];\nconst POINTER_LEAVE = [\"pointerleave\", \"mouseleave\", \"touchleave\"];\n\n// list of standard pointer event type\nconst pointerEventList = [\n\tWHEEL[0],\n\tPOINTER_MOVE[0],\n\tPOINTER_DOWN[0],\n\tPOINTER_UP[0],\n\tPOINTER_CANCEL[0],\n\tPOINTER_ENTER[0],\n\tPOINTER_OVER[0],\n\tPOINTER_LEAVE[0],\n];\n\n// legacy mouse event type\nconst mouseEventList = [\n\tWHEEL[0],\n\tPOINTER_MOVE[1],\n\tPOINTER_DOWN[1],\n\tPOINTER_UP[1],\n\tPOINTER_CANCEL[1],\n\tPOINTER_ENTER[1],\n\tPOINTER_OVER[1],\n\tPOINTER_LEAVE[1],\n];\n\n// iOS style touch event type\nconst touchEventList = [\n\tPOINTER_MOVE[2],\n\tPOINTER_DOWN[2],\n\tPOINTER_UP[2],\n\tPOINTER_CANCEL[2],\n\tPOINTER_ENTER[2],\n\tPOINTER_OVER[2],\n\tPOINTER_LEAVE[2],\n];\n\nconst pointerEventMap = {\n\twheel: WHEEL,\n\tpointermove: POINTER_MOVE,\n\tpointerdown: POINTER_DOWN,\n\tpointerup: POINTER_UP,\n\tpointercancel: POINTER_CANCEL,\n\tpointerenter: POINTER_ENTER,\n\tpointerover: POINTER_OVER,\n\tpointerleave: POINTER_LEAVE,\n};\n\n/**\n * Array of normalized events (mouse, touch, pointer)\n * @ignore\n */\nconst normalizedEvents = [];\n\n/**\n * addEventListerner for the specified event list and callback\n * @ignore\n */\nfunction registerEventListener(eventList, callback) {\n\tfor (let x = 0; x < eventList.length; x++) {\n\t\tif (POINTER_MOVE.indexOf(eventList[x]) === -1) {\n\t\t\tpointerEventTarget.addEventListener(eventList[x], callback, {\n\t\t\t\tpassive: preventDefault === false,\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * enable pointer event (Pointer/Mouse/Touch)\n * @ignore\n */\nfunction enablePointerEvent() {\n\tif (!pointerInitialized) {\n\t\t// the current pointer area\n\t\tcurrentPointer = new Rect(0, 0, 1, 1);\n\n\t\t// instantiate a pool of pointer catched\n\t\tfor (let v = 0; v < device.maxTouchPoints; v++) {\n\t\t\tT_POINTERS.push(new Pointer());\n\t\t}\n\n\t\tif (pointerEventTarget === null) {\n\t\t\t// default pointer event target\n\t\t\tpointerEventTarget = renderer.getCanvas();\n\t\t}\n\n\t\tif (device.pointerEvent) {\n\t\t\t// standard Pointer Events\n\t\t\tactiveEventList = pointerEventList;\n\t\t} else {\n\t\t\t// Regular Mouse events\n\t\t\tactiveEventList = mouseEventList;\n\t\t}\n\t\tif (device.touch && !device.pointerEvent) {\n\t\t\t// touch event on mobile devices\n\t\t\tactiveEventList = activeEventList.concat(touchEventList);\n\t\t}\n\t\tregisterEventListener(activeEventList, onPointerEvent);\n\n\t\t// set the PointerMove/touchMove/MouseMove event\n\t\tif (typeof throttlingInterval === \"undefined\") {\n\t\t\t// set the default value\n\t\t\tthrottlingInterval = ~~(1000 / timer.maxfps);\n\t\t}\n\n\t\tif (device.autoFocus === true) {\n\t\t\tdevice.focus();\n\t\t\tpointerEventTarget.addEventListener(\n\t\t\t\tactiveEventList[2], // MOUSE/POINTER DOWN\n\t\t\t\t() => {\n\t\t\t\t\tdevice.focus();\n\t\t\t\t},\n\t\t\t\t{ passive: preventDefault === false },\n\t\t\t);\n\t\t}\n\n\t\t// if time interval <= 16, disable the feature\n\t\tconst events = findAllActiveEvents(activeEventList, POINTER_MOVE);\n\t\tif (throttlingInterval < 17) {\n\t\t\tfor (let i = 0; i < events.length; i++) {\n\t\t\t\tif (activeEventList.indexOf(events[i]) !== -1) {\n\t\t\t\t\tpointerEventTarget.addEventListener(\n\t\t\t\t\t\tevents[i],\n\t\t\t\t\t\tonMoveEvent,\n\t\t\t\t\t\t{ passive: true }, // do not preventDefault on Move events\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < events.length; i++) {\n\t\t\t\tif (activeEventList.indexOf(events[i]) !== -1) {\n\t\t\t\t\tpointerEventTarget.addEventListener(\n\t\t\t\t\t\tevents[i],\n\t\t\t\t\t\tthrottle(onMoveEvent, throttlingInterval),\n\t\t\t\t\t\t{ passive: true }, // do not preventDefault on Move events\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// disable all gesture by default\n\t\tsetTouchAction(pointerEventTarget);\n\n\t\t// set a on change listener on pointerlock if supported\n\t\tif (device.hasPointerLockSupport) {\n\t\t\tglobalThis.document.addEventListener(\n\t\t\t\tPOINTERLOCKCHANGE,\n\t\t\t\t() => {\n\t\t\t\t\t// change the locked status accordingly\n\t\t\t\t\tlocked =\n\t\t\t\t\t\tglobalThis.document.pointerLockElement === game.getParentElement();\n\t\t\t\t\t// emit the corresponding internal event\n\t\t\t\t\teventEmitter.emit(POINTERLOCKCHANGE, locked);\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\t// all done !\n\t\tpointerInitialized = true;\n\t}\n}\n\n/**\n * @ignore\n */\nfunction findActiveEvent(activeEventList, eventTypes) {\n\tfor (let i = 0; i < eventTypes.length; i++) {\n\t\tconst event = activeEventList.indexOf(eventTypes[i]);\n\t\tif (event !== -1) {\n\t\t\treturn eventTypes[i];\n\t\t}\n\t}\n}\n\n/**\n * @ignore\n */\nfunction findAllActiveEvents(activeEventList, eventTypes) {\n\tconst events = [];\n\tfor (let i = 0; i < eventTypes.length; i++) {\n\t\tconst event = activeEventList.indexOf(eventTypes[i]);\n\t\tif (event !== -1) {\n\t\t\tevents.push(eventTypes[i]);\n\t\t}\n\t}\n\n\treturn events;\n}\n\n/**\n * @ignore\n */\nfunction triggerEvent(handlers, type, pointer, pointerId) {\n\tlet callback;\n\tif (handlers.callbacks[type]) {\n\t\thandlers.pointerId = pointerId;\n\t\tfor (\n\t\t\tlet i = handlers.callbacks[type].length - 1;\n\t\t\ti >= 0 && (callback = handlers.callbacks[type][i]);\n\t\t\ti--\n\t\t) {\n\t\t\tif (callback(pointer) === false) {\n\t\t\t\t// stop propagating the event if return false\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * propagate events to registered objects\n * @ignore\n */\nfunction dispatchEvent(normalizedEvents) {\n\tlet handled = false;\n\n\twhile (normalizedEvents.length > 0) {\n\t\t// keep a reference to the last item\n\t\tconst pointer = normalizedEvents.pop();\n\t\t// and put it back into our cache\n\t\tT_POINTERS.push(pointer);\n\n\t\t// Do not fire older touch events (not required for PointerEvent type)\n\t\tif (\n\t\t\tpointer.isNormalized === true &&\n\t\t\ttypeof pointer.event.timeStamp !== \"undefined\"\n\t\t) {\n\t\t\tif (pointer.event.timeStamp < lastTimeStamp) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlastTimeStamp = pointer.event.timeStamp;\n\t\t}\n\n\t\tcurrentPointer.pos.set(pointer.gameWorldX, pointer.gameWorldY);\n\t\tcurrentPointer.setSize(pointer.width, pointer.height);\n\n\t\t// trigger a global event for pointer move\n\t\tif (POINTER_MOVE.includes(pointer.type)) {\n\t\t\tpointer.gameX = pointer.gameLocalX = pointer.gameScreenX;\n\t\t\tpointer.gameY = pointer.gameLocalY = pointer.gameScreenY;\n\t\t\teventEmitter.emit(POINTERMOVE, pointer);\n\t\t}\n\n\t\t// fetch valid candiates from the game world container\n\t\tlet candidates = game.world.broadphase.retrieve(\n\t\t\tcurrentPointer,\n\t\t\tgame.world._sortReverseZ,\n\t\t);\n\n\t\t// add the main game viewport to the list of candidates\n\t\tcandidates = candidates.concat([game.viewport]);\n\n\t\tfor (\n\t\t\tlet c = candidates.length, candidate;\n\t\t\tc--, (candidate = candidates[c]);\n\t\t) {\n\t\t\tif (eventHandlers.has(candidate) && candidate.isKinematic !== true) {\n\t\t\t\tconst handlers = eventHandlers.get(candidate);\n\t\t\t\tconst region = handlers.region;\n\t\t\t\tconst ancestor = region.ancestor;\n\t\t\t\tconst bounds = region.getBounds();\n\t\t\t\tlet eventInBounds = false;\n\n\t\t\t\tif (region.isFloating === true) {\n\t\t\t\t\tpointer.gameX = pointer.gameLocalX = pointer.gameScreenX;\n\t\t\t\t\tpointer.gameY = pointer.gameLocalY = pointer.gameScreenY;\n\t\t\t\t} else {\n\t\t\t\t\tpointer.gameX = pointer.gameLocalX = pointer.gameWorldX;\n\t\t\t\t\tpointer.gameY = pointer.gameLocalY = pointer.gameWorldY;\n\t\t\t\t}\n\n\t\t\t\t// adjust gameLocalX to specify coordinates\n\t\t\t\t// within the region ancestor container\n\t\t\t\tif (typeof ancestor !== \"undefined\") {\n\t\t\t\t\tconst parentBounds = ancestor.getBounds();\n\t\t\t\t\tpointer.gameLocalX = pointer.gameX - parentBounds.x;\n\t\t\t\t\tpointer.gameLocalY = pointer.gameY - parentBounds.y;\n\t\t\t\t}\n\n\t\t\t\teventInBounds = bounds.contains(pointer.gameX, pointer.gameY);\n\n\t\t\t\tswitch (pointer.type) {\n\t\t\t\t\tcase POINTER_MOVE[0]:\n\t\t\t\t\tcase POINTER_MOVE[1]:\n\t\t\t\t\tcase POINTER_MOVE[2]:\n\t\t\t\t\tcase POINTER_MOVE[3]:\n\t\t\t\t\t\t// moved out of bounds: trigger the POINTER_LEAVE callbacks\n\t\t\t\t\t\tif (handlers.pointerId === pointer.pointerId && !eventInBounds) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttriggerEvent(\n\t\t\t\t\t\t\t\t\thandlers,\n\t\t\t\t\t\t\t\t\tfindActiveEvent(activeEventList, POINTER_LEAVE),\n\t\t\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// no pointer & moved inside of bounds: trigger the POINTER_ENTER callbacks\n\t\t\t\t\t\telse if (handlers.pointerId === null && eventInBounds) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttriggerEvent(\n\t\t\t\t\t\t\t\t\thandlers,\n\t\t\t\t\t\t\t\t\tfindActiveEvent(activeEventList, POINTER_ENTER),\n\t\t\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t\t\tpointer.pointerId,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// trigger the POINTER_MOVE callbacks\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\teventInBounds &&\n\t\t\t\t\t\t\ttriggerEvent(handlers, pointer.type, pointer, pointer.pointerId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase POINTER_UP[0]:\n\t\t\t\t\tcase POINTER_UP[1]:\n\t\t\t\t\tcase POINTER_UP[2]:\n\t\t\t\t\tcase POINTER_UP[3]:\n\t\t\t\t\t\t// pointer defined & inside of bounds: trigger the POINTER_UP callback\n\t\t\t\t\t\tif (handlers.pointerId === pointer.pointerId && eventInBounds) {\n\t\t\t\t\t\t\t// trigger the corresponding callback\n\t\t\t\t\t\t\tif (triggerEvent(handlers, pointer.type, pointer, null)) {\n\t\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase POINTER_CANCEL[0]:\n\t\t\t\t\tcase POINTER_CANCEL[1]:\n\t\t\t\t\tcase POINTER_CANCEL[2]:\n\t\t\t\t\tcase POINTER_CANCEL[3]:\n\t\t\t\t\t\t// pointer defined: trigger the POINTER_CANCEL callback\n\t\t\t\t\t\tif (handlers.pointerId === pointer.pointerId) {\n\t\t\t\t\t\t\t// trigger the corresponding callback\n\t\t\t\t\t\t\tif (triggerEvent(handlers, pointer.type, pointer, null)) {\n\t\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// event inside of bounds: trigger the POINTER_DOWN or WHEEL callback\n\t\t\t\t\t\tif (eventInBounds) {\n\t\t\t\t\t\t\t// trigger the corresponding callback\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttriggerEvent(handlers, pointer.type, pointer, pointer.pointerId)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (handled === true) {\n\t\t\t\t// stop iterating through this list of candidates\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn handled;\n}\n\n/**\n * translate event coordinates\n * @ignore\n */\nfunction normalizeEvent(originalEvent) {\n\tlet _pointer;\n\n\t// PointerEvent or standard Mouse event\n\tif (device.touchEvent && originalEvent.changedTouches) {\n\t\t// iOS/Android Touch event\n\t\tfor (let i = 0, l = originalEvent.changedTouches.length; i < l; i++) {\n\t\t\tconst touchEvent = originalEvent.changedTouches[i];\n\t\t\t_pointer = T_POINTERS.pop();\n\t\t\t_pointer.setEvent(\n\t\t\t\toriginalEvent,\n\t\t\t\ttouchEvent.pageX,\n\t\t\t\ttouchEvent.pageY,\n\t\t\t\ttouchEvent.clientX,\n\t\t\t\ttouchEvent.clientY,\n\t\t\t\ttouchEvent.identifier,\n\t\t\t);\n\t\t\tnormalizedEvents.push(_pointer);\n\t\t}\n\t} else {\n\t\t// Mouse or PointerEvent\n\t\t_pointer = T_POINTERS.pop();\n\t\t_pointer.setEvent(\n\t\t\toriginalEvent,\n\t\t\toriginalEvent.pageX,\n\t\t\toriginalEvent.pageY,\n\t\t\toriginalEvent.clientX,\n\t\t\toriginalEvent.clientY,\n\t\t\toriginalEvent.pointerId,\n\t\t);\n\t\tnormalizedEvents.push(_pointer);\n\t}\n\n\t// if event.isPrimary is defined and false, return\n\tif (originalEvent.isPrimary === false) {\n\t\treturn normalizedEvents;\n\t}\n\n\t// else use the first entry to simulate mouse event\n\tnormalizedEvents[0].isPrimary = true;\n\tObject.assign(pointer, normalizedEvents[0]);\n\n\treturn normalizedEvents;\n}\n\n/**\n * mouse/touch/pointer event management (move)\n * @ignore\n */\nfunction onMoveEvent(e) {\n\t// dispatch mouse event to registered object\n\tdispatchEvent(normalizeEvent(e));\n\t// do not prevent default on moveEvent :\n}\n\n/**\n * mouse/touch/pointer event management (start/down, end/up)\n * @ignore\n */\nfunction onPointerEvent(e) {\n\t// normalize eventTypes\n\tnormalizeEvent(e);\n\n\t// remember/use the first \"primary\" normalized event for pointer.bind\n\tconst button = normalizedEvents[0].button;\n\n\t// dispatch event to registered objects\n\tif (dispatchEvent(normalizedEvents) || e.type === \"wheel\") {\n\t\t// always preventDefault for wheel event (?legacy code/behavior?)\n\t\tif (preventDefault === true) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tconst keycode = pointer.bind[button];\n\n\t// check if mapped to a key\n\tif (keycode) {\n\t\ttriggerKeyEvent(keycode, POINTER_DOWN.includes(e.type), button + 1);\n\t}\n}\n\n/*\n * PUBLIC STUFF\n */\n\n/**\n * the default target element for pointer events (usually the canvas element in which the game is rendered)\n * @public\n * @type {EventTarget}\n * @name pointerEventTarget\n * @memberof input\n */\nexport let pointerEventTarget = null;\n\n/**\n * Pointer information (current position and size)\n * @public\n * @type {Rect}\n * @name pointer\n * @memberof input\n */\nexport const pointer = new Pointer(0, 0, 1, 1);\n\n/**\n * indicates if the pointer is currently locked\n * @public\n * @type {boolean}\n * @name locked\n * @memberof input\n */\nexport let locked = false;\n\n/**\n * time interval for event throttling in milliseconds<br>\n * default value : \"1000/me.timer.maxfps\" ms<br>\n * set to 0 ms to disable the feature\n * @public\n * @type {number}\n * @name throttlingInterval\n * @memberof input\n */\nexport let throttlingInterval;\n\n/**\n * return true if there are pending pointer events in the queue\n * @memberof input\n * @returns true if there are pending events\n */\nexport function hasActiveEvents() {\n\treturn normalizedEvents.length > 0;\n}\n\n/**\n * return true if there are register pointer events\n * @memberof input\n * @see {@link registerPointerEvent}\n * @returns true if there are pending events\n */\nexport function hasRegisteredEvents() {\n\treturn eventHandlers.size > 0;\n}\n\n/**\n * Translate the specified x and y values from the global (absolute)\n * coordinate to local (viewport) relative coordinate.\n * @memberof input\n * @param {number} x - the global x coordinate to be translated.\n * @param {number} y - the global y coordinate to be translated.\n * @param {Vector2d} [v] - an optional vector object where to set the translated coordinates\n * @returns {Vector2d} A vector object with the corresponding translated coordinates\n * @example\n * onMouseEvent : function (pointer) {\n * // convert the given into local (viewport) relative coordinates\n * let pos = me.input.globalToLocal(pointer.clientX, pointer.clientY);\n * // do something with pos !\n * };\n */\nexport function globalToLocal(x, y, v) {\n\tv = v || vector2dPool.get();\n\tconst rect = device.getElementBounds(renderer.getCanvas());\n\tconst pixelRatio = globalThis.devicePixelRatio || 1;\n\tx -= rect.left + (globalThis.pageXOffset || 0);\n\ty -= rect.top + (globalThis.pageYOffset || 0);\n\tconst scale = renderer.scaleRatio;\n\tif (scale.x !== 1.0 || scale.y !== 1.0) {\n\t\tx /= scale.x;\n\t\ty /= scale.y;\n\t}\n\treturn v.set(x * pixelRatio, y * pixelRatio);\n}\n\n/**\n * enable/disable all gestures on the given element.<br>\n * by default melonJS will disable browser handling of all panning and zooming gestures.\n * @memberof input\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action}\n * @param {HTMLCanvasElement} element\n * @param {string} [value=\"none\"]\n */\nexport function setTouchAction(element, value) {\n\telement.style[\"touch-action\"] = value || \"none\";\n}\n\n/**\n * Associate a pointer event to a keycode<br>\n * Left button \u2013 0\n * Middle button \u2013 1\n * Right button \u2013 2\n * @memberof input\n * @param {number} [button=input.pointer.LEFT] - (accordingly to W3C values : 0,1,2 for left, middle and right buttons)\n * @param {input.KEY} keyCode\n * @example\n * // enable the keyboard\n * me.input.bindKey(me.input.KEY.X, \"shoot\");\n * // map the left button click on the X key (default if the button is not specified)\n * me.input.bindPointer(me.input.KEY.X);\n * // map the right button click on the X key\n * me.input.bindPointer(me.input.pointer.RIGHT, me.input.KEY.X);\n */\nexport function bindPointer() {\n\tconst button = arguments.length < 2 ? pointer.LEFT : arguments[0];\n\tconst keyCode = arguments.length < 2 ? arguments[0] : arguments[1];\n\n\t// make sure the mouse is initialized\n\tenablePointerEvent();\n\n\t// throw an exception if no action is defined for the specified keycode\n\tif (!getBindingKey(keyCode)) {\n\t\tthrow new Error(\"no action defined for keycode \" + keyCode);\n\t}\n\t// map the mouse button to the keycode\n\tpointer.bind[button] = keyCode;\n}\n\n/**\n * unbind the defined keycode\n * @memberof input\n * @param {number} [button=input.pointer.LEFT] - (accordingly to W3C values : 0,1,2 for left, middle and right buttons)\n * @example\n * me.input.unbindPointer(me.input.pointer.LEFT);\n */\nexport function unbindPointer(button) {\n\t// clear the event status\n\tpointer.bind[typeof button === \"undefined\" ? pointer.LEFT : button] = null;\n}\n\n/**\n * allows registration of event listeners on the object target. <br>\n * melonJS will pass a me.Pointer object to the defined callback.\n * @see Pointer\n * @see {@link http://www.w3.org/TR/pointerevents/#list-of-pointer-events | W3C Pointer Event list}\n * @memberof input\n * @param {string} eventType - The event type for which the object is registering <br>\n * melonJS currently supports: <br>\n * <ul>\n * <li><code>\"pointermove\"</code></li>\n * <li><code>\"pointerdown\"</code></li>\n * <li><code>\"pointerup\"</code></li>\n * <li><code>\"pointerenter\"</code></li>\n * <li><code>\"pointerover\"</code></li>\n * <li><code>\"pointerleave\"</code></li>\n * <li><code>\"pointercancel\"</code></li>\n * <li><code>\"wheel\"</code></li>\n * </ul>\n * @param {Rect|Polygon|Line|Ellipse} region - a shape representing the region to register on\n * @param {Function} callback - methods to be called when the event occurs.\n * Returning `false` from the defined callback will prevent the event to be propagated to other objects\n * @example\n * // onActivate function\n * onActivateEvent: function () {\n * // register on the 'pointerdown' event\n * me.input.registerPointerEvent('pointerdown', this, (e) => this.pointerDown(e));\n * },\n *\n * // pointerDown event callback\n * pointerDown: function (pointer) {\n * // do something\n * ....\n * // don\"t propagate the event to other objects\n * return false;\n * },\n */\nexport function registerPointerEvent(eventType, region, callback) {\n\t// make sure the mouse/touch events are initialized\n\tenablePointerEvent();\n\n\tif (pointerEventList.indexOf(eventType) === -1) {\n\t\tthrow new Error(\"invalid event type : \" + eventType);\n\t}\n\n\tif (typeof region === \"undefined\") {\n\t\tthrow new Error(\n\t\t\t\"registerPointerEvent: region for \" +\n\t\t\t\ttoString(region) +\n\t\t\t\t\" event is undefined \",\n\t\t);\n\t}\n\n\tconst eventTypes = findAllActiveEvents(\n\t\tactiveEventList,\n\t\tpointerEventMap[eventType],\n\t);\n\n\t// register the event\n\tif (!eventHandlers.has(region)) {\n\t\teventHandlers.set(region, {\n\t\t\tregion: region,\n\t\t\tcallbacks: {},\n\t\t\tpointerId: null,\n\t\t});\n\t}\n\n\t// allocate array if not defined\n\tconst handlers = eventHandlers.get(region);\n\tfor (let i = 0; i < eventTypes.length; i++) {\n\t\tconst eventType = eventTypes[i];\n\t\tif (handlers.callbacks[eventType]) {\n\t\t\thandlers.callbacks[eventType].push(callback);\n\t\t} else {\n\t\t\thandlers.callbacks[eventType] = [callback];\n\t\t}\n\t}\n}\n\n/**\n * allows the removal of event listeners from the object target.\n * @see {@link http://www.w3.org/TR/pointerevents/#list-of-pointer-events|W3C Pointer Event list}\n * @memberof input\n * @param {string} eventType - The event type for which the object was registered. See {@link input.registerPointerEvent}\n * @param {Rect|Polygon|Line|Ellipse} region - the registered region to release for this event\n * @param {Function} [callback=\"all\"] - if specified unregister the event only for the specific callback\n * @example\n * // release the registered region on the 'pointerdown' event\n * me.input.releasePointerEvent('pointerdown', this);\n */\nexport function releasePointerEvent(eventType, region, callback) {\n\tif (pointerEventList.indexOf(eventType) === -1) {\n\t\tthrow new Error(\"invalid event type : \" + eventType);\n\t}\n\n\t// convert to supported event type if pointerEvent not natively supported\n\tconst eventTypes = findAllActiveEvents(\n\t\tactiveEventList,\n\t\tpointerEventMap[eventType],\n\t);\n\n\tconst handlers = eventHandlers.get(region);\n\tif (typeof handlers !== \"undefined\") {\n\t\tfor (let i = 0; i < eventTypes.length; i++) {\n\t\t\tconst eventType = eventTypes[i];\n\t\t\tif (handlers.callbacks[eventType]) {\n\t\t\t\tif (typeof callback !== \"undefined\") {\n\t\t\t\t\tremove(handlers.callbacks[eventType], callback);\n\t\t\t\t} else {\n\t\t\t\t\twhile (handlers.callbacks[eventType].length > 0) {\n\t\t\t\t\t\thandlers.callbacks[eventType].pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// free the array if empty\n\t\t\t\tif (handlers.callbacks[eventType].length === 0) {\n\t\t\t\t\tdelete handlers.callbacks[eventType];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(handlers.callbacks).length === 0) {\n\t\t\teventHandlers.delete(region);\n\t\t}\n\t}\n}\n\n/**\n * allows the removal of all registered event listeners from the object target.\n * @memberof input\n * @param {Rect|Polygon|Line|Ellipse} region - the registered region to release event from\n * @example\n * // release all registered event on the\n * me.input.releaseAllPointerEvents(this);\n */\nexport function releaseAllPointerEvents(region) {\n\tif (eventHandlers.has(region)) {\n\t\tfor (let i = 0; i < pointerEventList.length; i++) {\n\t\t\treleasePointerEvent(pointerEventList[i], region);\n\t\t}\n\t}\n}\n\n/**\n * request for the pointer to be locked on the parent DOM element.\n * (Must be called in a click event or an event that requires user interaction)\n * @memberof input\n * @returns {boolean} return true if the request was successfully submitted\n * @example\n * // register on the pointer lock change event\n * event.on(event.POINTERLOCKCHANGE, (locked)=> {\n * console.log(\"pointer lock: \" + locked);\n * });\n * // request for pointer lock\n * me.input.requestPointerLock();\n */\nexport function requestPointerLock() {\n\tif (device.hasPointerLockSupport) {\n\t\tconst element = game.getParentElement();\n\t\telement.requestPointerLock();\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Initiates an exit from pointer lock state\n * @memberof input\n * @returns {boolean} return true if the request was successfully submitted\n */\nexport function exitPointerLock() {\n\tif (device.hasPointerLockSupport) {\n\t\tglobalThis.document.exitPointerLock();\n\t\treturn true;\n\t}\n\treturn false;\n}\n", "import { Vector2d } from \"../math/vector2d.ts\";\n\n/**\n * An object representing the result of an intersection.\n * @typedef {object} ResponseObject\n * @property {Renderable} a The first object participating in the intersection\n * @property {Renderable} b The second object participating in the intersection\n * @property {number} overlap Magnitude of the overlap on the shortest colliding axis\n * @property {Vector2d} overlapV The overlap vector (i.e. `overlapN.scale(overlap, overlap)`). If this vector is subtracted from the position of a, a and b will no longer be colliding\n * @property {Vector2d} overlapN The shortest colliding axis (unit-vector)\n * @property {boolean} aInB Whether the first object is entirely inside the second\n * @property {boolean} bInA Whether the second object is entirely inside the first\n * @property {number} indexShapeA The index of the colliding shape for the object a body\n * @property {number} indexShapeB The index of the colliding shape for the object b body\n */\nclass ResponseObject {\n\tconstructor() {\n\t\tthis.a = null;\n\t\tthis.b = null;\n\t\tthis.overlapN = new Vector2d();\n\t\tthis.overlapV = new Vector2d();\n\t\tthis.aInB = true;\n\t\tthis.bInA = true;\n\t\tthis.indexShapeA = -1;\n\t\tthis.indexShapeB = -1;\n\t\tthis.overlap = Number.MAX_VALUE;\n\t}\n\n\t/**\n\t * Set some values of the response back to their defaults. <br>\n\t * Call this between tests if you are going to reuse a single <br>\n\t * Response object for multiple intersection tests <br>\n\t * (recommended as it will avoid allocating extra memory) <br>\n\t * @name clear\n\t * @public\n\t * @returns {object} this object for chaining\n\t */\n\tclear() {\n\t\tthis.aInB = true;\n\t\tthis.bInA = true;\n\t\tthis.overlap = Number.MAX_VALUE;\n\t\tthis.indexShapeA = -1;\n\t\tthis.indexShapeB = -1;\n\t\treturn this;\n\t}\n}\n\nexport default ResponseObject;\n", "import { Vector2d } from \"../math/vector2d.ts\";\n\n/*\n * Separating Axis Theorem implementation, based on the SAT.js library by Jim Riecken <jimr@jimr.ca>\n * Available under the MIT License - https://github.com/jriecken/sat-js\n */\n\n/**\n * @import Entity from \"./../renderable/entity/entity.js\";\n * @import Container from \"./../renderable/container.js\";\n * @import Renderable from \"./../renderable/renderable.js\";\n * @import Sprite from \"./../renderable/sprite.js\";\n * @import NineSliceSprite from \"./../renderable/nineslicesprite.js\";\n * @import {Polygon} from \"../geometries/polygon.ts\";\n * @import {Ellipse} from \"./../geometries/ellipse.ts\";\n */\n\n/**\n * Constants for Vornoi regions\n * @ignore\n */\nconst LEFT_VORNOI_REGION = -1;\n\n/**\n * Constants for Vornoi regions\n * @ignore\n */\nconst MIDDLE_VORNOI_REGION = 0;\n\n/**\n * Constants for Vornoi regions\n * @ignore\n */\nconst RIGHT_VORNOI_REGION = 1;\n\n/**\n * A pool of `Vector` objects that are used in calculations to avoid allocating memory.\n * @type {Array.<Vector2d>}\n * @ignore\n */\nconst T_VECTORS = [];\nfor (let v = 0; v < 10; v++) {\n\tT_VECTORS.push(new Vector2d());\n}\n\n/**\n * A pool of arrays of numbers used in calculations to avoid allocating memory.\n * @type {Array.<Array.<number>>}\n * @ignore\n */\nconst T_ARRAYS = [];\nfor (let a = 0; a < 5; a++) {\n\tT_ARRAYS.push([]);\n}\n\n/**\n * Flattens the specified array of points onto a unit vector axis,\n * resulting in a one dimensional range of the minimum and\n * maximum value on that axis.\n * @ignore\n * @param {Array.<Vector2d>} points - The points to flatten.\n * @param {Vector2d} normal - The unit vector axis to flatten on.\n * @param {Array.<number>} result - An array. After calling this function,\n * result[0] will be the minimum value,\n * result[1] will be the maximum value.\n */\nfunction flattenPointsOn(points, normal, result) {\n\tlet min = Number.MAX_VALUE;\n\tlet max = -Number.MAX_VALUE;\n\tconst len = points.length;\n\tfor (let i = 0; i < len; i++) {\n\t\t// The magnitude of the projection of the point onto the normal\n\t\tconst dot = points[i].dot(normal);\n\t\tif (dot < min) {\n\t\t\tmin = dot;\n\t\t}\n\t\tif (dot > max) {\n\t\t\tmax = dot;\n\t\t}\n\t}\n\tresult[0] = min;\n\tresult[1] = max;\n}\n\n/**\n * Check whether two convex polygons are separated by the specified\n * axis (must be a unit vector).\n * @ignore\n * @param {Vector2d} aPos - The position of the first polygon.\n * @param {Vector2d} bPos - The position of the second polygon.\n * @param {Array.<Vector2d>} aPoints - The points in the first polygon.\n * @param {Array.<Vector2d>} bPoints - The points in the second polygon.\n * @param {Vector2d} axis - The axis (unit sized) to test against. The points of both polygons\n * will be projected onto this axis.\n * @param {Response=} response - A Response object (optional) which will be populated\n * if the axis is not a separating axis.\n * @returns {boolean} true if it is a separating axis, false otherwise. If false,\n * and a response is passed in, information about how much overlap and\n * the direction of the overlap will be populated.\n */\nfunction isSeparatingAxis(aPos, bPos, aPoints, bPoints, axis, response) {\n\tconst rangeA = T_ARRAYS.pop();\n\tconst rangeB = T_ARRAYS.pop();\n\t// The magnitude of the offset between the two polygons\n\tconst offsetV = T_VECTORS.pop().copy(bPos).sub(aPos);\n\tconst projectedOffset = offsetV.dot(axis);\n\n\t// Project the polygons onto the axis.\n\tflattenPointsOn(aPoints, axis, rangeA);\n\tflattenPointsOn(bPoints, axis, rangeB);\n\t// Move B's range to its position relative to A.\n\trangeB[0] += projectedOffset;\n\trangeB[1] += projectedOffset;\n\t// Check if there is a gap. If there is, this is a separating axis and we can stop\n\tif (rangeA[0] > rangeB[1] || rangeB[0] > rangeA[1]) {\n\t\tT_VECTORS.push(offsetV);\n\t\tT_ARRAYS.push(rangeA);\n\t\tT_ARRAYS.push(rangeB);\n\t\treturn true;\n\t}\n\n\t// This is not a separating axis. If we're calculating a response, calculate the overlap.\n\tif (response) {\n\t\tlet overlap = 0;\n\t\t// A starts further left than B\n\t\tif (rangeA[0] < rangeB[0]) {\n\t\t\tresponse.aInB = false;\n\t\t\t// A ends before B does. We have to pull A out of B\n\t\t\tif (rangeA[1] < rangeB[1]) {\n\t\t\t\toverlap = rangeA[1] - rangeB[0];\n\t\t\t\tresponse.bInA = false;\n\t\t\t\t// B is fully inside A. Pick the shortest way out.\n\t\t\t} else {\n\t\t\t\tconst option1 = rangeA[1] - rangeB[0];\n\t\t\t\tconst option2 = rangeB[1] - rangeA[0];\n\t\t\t\toverlap = option1 < option2 ? option1 : -option2;\n\t\t\t}\n\t\t\t// B starts further left than A\n\t\t} else {\n\t\t\tresponse.bInA = false;\n\t\t\t// B ends before A ends. We have to push A out of B\n\t\t\tif (rangeA[1] > rangeB[1]) {\n\t\t\t\toverlap = rangeA[0] - rangeB[1];\n\t\t\t\tresponse.aInB = false;\n\t\t\t\t// A is fully inside B. Pick the shortest way out.\n\t\t\t} else {\n\t\t\t\tconst option11 = rangeA[1] - rangeB[0];\n\t\t\t\tconst option22 = rangeB[1] - rangeA[0];\n\t\t\t\toverlap = option11 < option22 ? option11 : -option22;\n\t\t\t}\n\t\t}\n\n\t\t// If this is the smallest amount of overlap we've seen so far, set it as the minimum overlap.\n\t\tconst absOverlap = Math.abs(overlap);\n\t\tif (absOverlap < response.overlap) {\n\t\t\tresponse.overlap = absOverlap;\n\t\t\tresponse.overlapN.copy(axis);\n\t\t\tif (overlap < 0) {\n\t\t\t\tresponse.overlapN.negateSelf();\n\t\t\t}\n\t\t}\n\t}\n\tT_VECTORS.push(offsetV);\n\tT_ARRAYS.push(rangeA);\n\tT_ARRAYS.push(rangeB);\n\treturn false;\n}\n\n/**\n * Calculates which Vornoi region a point is on a line segment. <br>\n * It is assumed that both the line and the point are relative to `(0,0)`<br>\n * <pre>\n * | (0) |\n * (-1) [S]--------------[E] (1)\n * | (0) |\n * </pre>\n *\n * @ignore\n * @param {Vector2d} line - The line segment.\n * @param {Vector2d} point - The point.\n * @returns {number} LEFT_VORNOI_REGION (-1) if it is the left region,\n * MIDDLE_VORNOI_REGION (0) if it is the middle region,\n * RIGHT_VORNOI_REGION (1) if it is the right region.\n */\nfunction vornoiRegion(line, point) {\n\tconst len2 = line.length2();\n\tconst dp = point.dot(line);\n\tif (dp < 0) {\n\t\t// If the point is beyond the start of the line, it is in the\n\t\t// left vornoi region.\n\t\treturn LEFT_VORNOI_REGION;\n\t} else if (dp > len2) {\n\t\t// If the point is beyond the end of the line, it is in the\n\t\t// right vornoi region.\n\t\treturn RIGHT_VORNOI_REGION;\n\t} else {\n\t\t// Otherwise, it's in the middle one.\n\t\treturn MIDDLE_VORNOI_REGION;\n\t}\n}\n\n/**\n * Checks whether polygons collide.\n * @ignore\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} a - a reference to the object A.\n * @param {Polygon} polyA - a reference to the object A Polygon to be tested\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} b - a reference to the object B.\n * @param {Polygon} polyB - a reference to the object B Polygon to be tested\n * @param {Response=} response - Response object (optional) that will be populated if they intersect.\n * @returns {boolean} true if they intersect, false if they don't.\n */\nexport function testPolygonPolygon(a, polyA, b, polyB, response) {\n\t// specific point for\n\tconst aPoints = polyA.points;\n\tconst aNormals = polyA.normals;\n\tconst aLen = aNormals.length;\n\tconst bPoints = polyB.points;\n\tconst bNormals = polyB.normals;\n\tconst bLen = bNormals.length;\n\t// aboslute shape position\n\tconst posA = T_VECTORS.pop()\n\t\t.copy(a.pos)\n\t\t.add(a.ancestor.getAbsolutePosition())\n\t\t.add(polyA.pos);\n\tconst posB = T_VECTORS.pop()\n\t\t.copy(b.pos)\n\t\t.add(b.ancestor.getAbsolutePosition())\n\t\t.add(polyB.pos);\n\n\t// If any of the edge normals of A is a separating axis, no intersection.\n\tfor (let i = 0; i < aLen; i++) {\n\t\tif (isSeparatingAxis(posA, posB, aPoints, bPoints, aNormals[i], response)) {\n\t\t\tT_VECTORS.push(posA);\n\t\t\tT_VECTORS.push(posB);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// If any of the edge normals of B is a separating axis, no intersection.\n\tfor (let i = 0; i < bLen; i++) {\n\t\tif (isSeparatingAxis(posA, posB, aPoints, bPoints, bNormals[i], response)) {\n\t\t\tT_VECTORS.push(posA);\n\t\t\tT_VECTORS.push(posB);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Since none of the edge normals of A or B are a separating axis, there is an intersection\n\t// and we've already calculated the smallest overlap (in isSeparatingAxis). Calculate the\n\t// final overlap vector.\n\tif (response) {\n\t\tresponse.a = a;\n\t\tresponse.b = b;\n\t\tresponse.overlapV.copy(response.overlapN).scale(response.overlap);\n\t}\n\tT_VECTORS.push(posA);\n\tT_VECTORS.push(posB);\n\treturn true;\n}\n\n/**\n * Check if two Ellipse collide.\n * @ignore\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} a - a reference to the object A.\n * @param {Ellipse} ellipseA - a reference to the object A Ellipse to be tested\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} b - a reference to the object B.\n * @param {Ellipse} ellipseB - a reference to the object B Ellipse to be tested\n * @param {Response=} response - Response object (optional) that will be populated if\n * the circles intersect.\n * @returns {boolean} true if the circles intersect, false if they don't.\n */\nexport function testEllipseEllipse(a, ellipseA, b, ellipseB, response) {\n\t// Check if the distance between the centers of the two\n\t// circles is greater than their combined radius.\n\tconst differenceV = T_VECTORS.pop()\n\t\t.copy(b.pos)\n\t\t.add(b.ancestor.getAbsolutePosition())\n\t\t.add(ellipseB.pos)\n\t\t.sub(a.pos)\n\t\t.add(a.ancestor.getAbsolutePosition())\n\t\t.sub(ellipseA.pos);\n\tconst radiusA = ellipseA.radius;\n\tconst radiusB = ellipseB.radius;\n\tconst totalRadius = radiusA + radiusB;\n\tconst totalRadiusSq = totalRadius * totalRadius;\n\tconst distanceSq = differenceV.length2();\n\t// If the distance is bigger than the combined radius, they don't intersect.\n\tif (distanceSq > totalRadiusSq) {\n\t\tT_VECTORS.push(differenceV);\n\t\treturn false;\n\t}\n\t// They intersect. If we're calculating a response, calculate the overlap.\n\tif (response) {\n\t\tconst dist = Math.sqrt(distanceSq);\n\t\tresponse.a = a;\n\t\tresponse.b = b;\n\t\tresponse.overlap = totalRadius - dist;\n\t\tresponse.overlapN.copy(differenceV.normalize());\n\t\tresponse.overlapV.copy(differenceV).scale(response.overlap);\n\t\tresponse.aInB = radiusA <= radiusB && dist <= radiusB - radiusA;\n\t\tresponse.bInA = radiusB <= radiusA && dist <= radiusA - radiusB;\n\t}\n\tT_VECTORS.push(differenceV);\n\treturn true;\n}\n\n/**\n * Check if a polygon and an ellipse collide.\n * @ignore\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} a - a reference to the object A.\n * @param {Polygon} polyA - a reference to the object A Polygon to be tested\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} b - a reference to the object B.\n * @param {Ellipse} ellipseB - a reference to the object B Ellipse to be tested\n * @param {Response=} response - Response object (optional) that will be populated if they intersect.\n * @returns {boolean} true if they intersect, false if they don't.\n */\nexport function testPolygonEllipse(a, polyA, b, ellipseB, response) {\n\t// Get the position of the circle relative to the polygon.\n\tconst circlePos = T_VECTORS.pop()\n\t\t.copy(b.pos)\n\t\t.add(b.ancestor.getAbsolutePosition())\n\t\t.add(ellipseB.pos)\n\t\t.sub(a.pos)\n\t\t.add(a.ancestor.getAbsolutePosition())\n\t\t.sub(polyA.pos);\n\tconst radius = ellipseB.radius;\n\tconst radius2 = radius * radius;\n\tconst points = polyA.points;\n\tconst edges = polyA.edges;\n\tconst len = edges.length;\n\tconst edge = T_VECTORS.pop();\n\tconst normal = T_VECTORS.pop();\n\tconst point = T_VECTORS.pop();\n\tlet dist = 0;\n\n\t// For each edge in the polygon:\n\tfor (let i = 0; i < len; i++) {\n\t\tconst next = i === len - 1 ? 0 : i + 1;\n\t\tconst prev = i === 0 ? len - 1 : i - 1;\n\t\tlet overlap = 0;\n\t\tlet overlapN = null;\n\n\t\t// Get the edge.\n\t\tedge.copy(edges[i]);\n\t\t// Calculate the center of the circle relative to the starting point of the edge.\n\t\tpoint.copy(circlePos).sub(points[i]);\n\n\t\t// If the distance between the center of the circle and the point\n\t\t// is bigger than the radius, the polygon is definitely not fully in\n\t\t// the circle.\n\t\tif (response && point.length2() > radius2) {\n\t\t\tresponse.aInB = false;\n\t\t}\n\n\t\t// Calculate which Vornoi region the center of the circle is in.\n\t\tlet region = vornoiRegion(edge, point);\n\t\tlet inRegion = true;\n\t\t// If it's the left region:\n\t\tif (region === LEFT_VORNOI_REGION) {\n\t\t\tlet point2 = null;\n\t\t\tif (len > 1) {\n\t\t\t\t// We need to make sure we're in the RIGHT_VORNOI_REGION of the previous edge.\n\t\t\t\tedge.copy(edges[prev]);\n\t\t\t\t// Calculate the center of the circle relative the starting point of the previous edge\n\t\t\t\tpoint2 = T_VECTORS.pop().copy(circlePos).sub(points[prev]);\n\t\t\t\tregion = vornoiRegion(edge, point2);\n\t\t\t\tif (region !== RIGHT_VORNOI_REGION) {\n\t\t\t\t\tinRegion = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inRegion) {\n\t\t\t\t// It's in the region we want. Check if the circle intersects the point.\n\t\t\t\tdist = point.length();\n\t\t\t\tif (dist > radius) {\n\t\t\t\t\t// No intersection\n\t\t\t\t\tT_VECTORS.push(circlePos);\n\t\t\t\t\tT_VECTORS.push(edge);\n\t\t\t\t\tT_VECTORS.push(normal);\n\t\t\t\t\tT_VECTORS.push(point);\n\t\t\t\t\tif (point2) {\n\t\t\t\t\t\tT_VECTORS.push(point2);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (response) {\n\t\t\t\t\t// It intersects, calculate the overlap.\n\t\t\t\t\tresponse.bInA = false;\n\t\t\t\t\toverlapN = point.normalize();\n\t\t\t\t\toverlap = radius - dist;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (point2) {\n\t\t\t\tT_VECTORS.push(point2);\n\t\t\t}\n\t\t\t// If it's the right region:\n\t\t} else if (region === RIGHT_VORNOI_REGION) {\n\t\t\tif (len > 1) {\n\t\t\t\t// We need to make sure we're in the left region on the next edge\n\t\t\t\tedge.copy(edges[next]);\n\t\t\t\t// Calculate the center of the circle relative to the starting point of the next edge.\n\t\t\t\tpoint.copy(circlePos).sub(points[next]);\n\t\t\t\tregion = vornoiRegion(edge, point);\n\t\t\t\tif (region !== LEFT_VORNOI_REGION) {\n\t\t\t\t\tinRegion = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inRegion) {\n\t\t\t\t// It's in the region we want. Check if the circle intersects the point.\n\t\t\t\tdist = point.length();\n\t\t\t\tif (dist > radius) {\n\t\t\t\t\t// No intersection\n\t\t\t\t\tT_VECTORS.push(circlePos);\n\t\t\t\t\tT_VECTORS.push(edge);\n\t\t\t\t\tT_VECTORS.push(normal);\n\t\t\t\t\tT_VECTORS.push(point);\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (response) {\n\t\t\t\t\t// It intersects, calculate the overlap.\n\t\t\t\t\tresponse.bInA = false;\n\t\t\t\t\toverlapN = point.normalize();\n\t\t\t\t\toverlap = radius - dist;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Otherwise, it's the middle region:\n\t\t} else {\n\t\t\t// Need to check if the circle is intersecting the edge,\n\t\t\t// Get the normal.\n\t\t\tnormal.copy(polyA.normals[i]);\n\t\t\t// Find the perpendicular distance between the center of the\n\t\t\t// circle and the edge.\n\t\t\tdist = point.dot(normal);\n\t\t\tconst distAbs = Math.abs(dist);\n\t\t\t// If the circle is on the outside of the edge, there is no intersection.\n\t\t\tif ((len === 1 || dist > 0) && distAbs > radius) {\n\t\t\t\t// No intersection\n\t\t\t\tT_VECTORS.push(circlePos);\n\t\t\t\tT_VECTORS.push(edge);\n\t\t\t\tT_VECTORS.push(normal);\n\t\t\t\tT_VECTORS.push(point);\n\t\t\t\treturn false;\n\t\t\t} else if (response) {\n\t\t\t\t// It intersects, calculate the overlap.\n\t\t\t\toverlapN = normal;\n\t\t\t\toverlap = radius - dist;\n\t\t\t\t// If the center of the circle is on the outside of the edge, or part of the\n\t\t\t\t// circle is on the outside, the circle is not fully inside the polygon.\n\t\t\t\tif (dist >= 0 || overlap < 2 * radius) {\n\t\t\t\t\tresponse.bInA = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If this is the smallest overlap we've seen, keep it.\n\t\t// (overlapN may be null if the circle was in the wrong Vornoi region).\n\t\tif (\n\t\t\toverlapN &&\n\t\t\tresponse &&\n\t\t\tMath.abs(overlap) < Math.abs(response.overlap)\n\t\t) {\n\t\t\tresponse.overlap = overlap;\n\t\t\tresponse.overlapN.copy(overlapN);\n\t\t}\n\t}\n\n\t// Calculate the final overlap vector - based on the smallest overlap.\n\tif (response) {\n\t\tresponse.a = a;\n\t\tresponse.b = b;\n\t\tresponse.overlapV.copy(response.overlapN).scale(response.overlap);\n\t}\n\tT_VECTORS.push(circlePos);\n\tT_VECTORS.push(edge);\n\tT_VECTORS.push(normal);\n\tT_VECTORS.push(point);\n\treturn true;\n}\n\n/**\n * Check if an ellipse and a polygon collide. <br>\n * **NOTE:** This is slightly less efficient than testPolygonEllipse as it just\n * runs testPolygonEllipse and reverses the response at the end.\n * @ignore\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} a - a reference to the object A.\n * @param {Ellipse} ellipseA - a reference to the object A Ellipse to be tested\n * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} b - a reference to the object B.\n * @param {Polygon} polyB - a reference to the object B Polygon to be tested\n * @param {Response=} response - Response object (optional) that will be populated if\n * they intersect.\n * @returns {boolean} true if they intersect, false if they don't.\n */\nexport function testEllipsePolygon(a, ellipseA, b, polyB, response) {\n\t// Test the polygon against the circle.\n\tconst result = testPolygonEllipse(b, polyB, a, ellipseA, response);\n\tif (result && response) {\n\t\t// Swap A and B in the response.\n\t\tconst resa = response.a;\n\t\tconst aInB = response.aInB;\n\t\tresponse.overlapN.negateSelf();\n\t\tresponse.overlapV.negateSelf();\n\t\tresponse.a = response.b;\n\t\tresponse.b = resa;\n\t\tresponse.aInB = response.bInA;\n\t\tresponse.bInA = aInB;\n\t}\n\treturn result;\n}\n", "import { Vector2d } from \"../math/vector2d.ts\";\nimport { Bounds } from \"./bounds.ts\";\nimport ResponseObject from \"./response.js\";\nimport {\n\ttestEllipseEllipse,\n\ttestEllipsePolygon,\n\ttestPolygonEllipse,\n\ttestPolygonPolygon,\n} from \"./sat.js\";\n\n// pre-built lookup table for SAT collision tests to avoid string concatenation\nconst SAT_LOOKUP = {\n\tPolygonPolygon: testPolygonPolygon,\n\tPolygonEllipse: testPolygonEllipse,\n\tEllipsePolygon: testEllipsePolygon,\n\tEllipseEllipse: testEllipseEllipse,\n};\n\n/**\n * @import Entity from \"./../renderable/entity/entity.js\";\n * @import Container from \"./../renderable/container.js\";\n * @import Renderable from \"./../renderable/renderable.js\";\n * @import Sprite from \"./../renderable/sprite.js\";\n * @import NineSliceSprite from \"./../renderable/nineslicesprite.js\";\n * @import {Line} from \"./../geometries/line.ts\";\n */\n\n// a dummy object when using Line for raycasting\nconst dummyObj = {\n\tpos: new Vector2d(0, 0),\n\tancestor: {\n\t\t_absPos: new Vector2d(0, 0),\n\t\tgetAbsolutePosition: function () {\n\t\t\treturn this._absPos;\n\t\t},\n\t},\n};\n\n// some cache bounds object used for collision detection\nconst boundsA = new Bounds();\nconst boundsB = new Bounds();\n\n/**\n * the Detector class contains methods for detecting collisions between bodies using a broadphase algorithm.\n */\nclass Detector {\n\t/**\n\t * @param {Container} world - the physic world this detector is bind to\n\t */\n\tconstructor(world) {\n\t\t// @ignore\n\t\tthis.world = world;\n\n\t\t/**\n\t\t * the default response object used for collisions\n\t\t * (will be automatically populated by the collides functions)\n\t\t * @type {ResponseObject}\n\t\t */\n\t\tthis.response = new ResponseObject();\n\t}\n\n\t/**\n\t * determine if two objects should collide (based on both respective objects body collision mask and type).<br>\n\t * you can redefine this function if you need any specific rules over what should collide with what.\n\t * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} a - a reference to the object A.\n\t * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} b - a reference to the object B.\n\t * @returns {boolean} true if they should collide, false otherwise\n\t */\n\tshouldCollide(a, b) {\n\t\tconst bodyA = a.body;\n\t\tconst bodyB = b.body;\n\t\treturn (\n\t\t\ttypeof bodyA === \"object\" &&\n\t\t\ttypeof bodyB === \"object\" &&\n\t\t\ta !== b &&\n\t\t\ta.isKinematic !== true &&\n\t\t\tb.isKinematic !== true &&\n\t\t\tbodyA.shapes.length > 0 &&\n\t\t\tbodyB.shapes.length > 0 &&\n\t\t\t!(bodyA.isStatic === true && bodyB.isStatic === true) &&\n\t\t\t(bodyA.collisionMask & bodyB.collisionType) !== 0 &&\n\t\t\t(bodyA.collisionType & bodyB.collisionMask) !== 0\n\t\t);\n\t}\n\n\t/**\n\t * detect collision between two bodies.\n\t * @param {Body} bodyA - a reference to body A.\n\t * @param {Body} bodyB - a reference to body B.\n\t * @returns {boolean} true if colliding\n\t */\n\tcollides(bodyA, bodyB, response = this.response) {\n\t\t// for each shape in body A\n\t\tfor (\n\t\t\tlet indexA = bodyA.shapes.length, shapeA;\n\t\t\tindexA--, (shapeA = bodyA.shapes[indexA]);\n\t\t) {\n\t\t\t// for each shape in body B\n\t\t\tfor (\n\t\t\t\tlet indexB = bodyB.shapes.length, shapeB;\n\t\t\t\tindexB--, (shapeB = bodyB.shapes[indexB]);\n\t\t\t) {\n\t\t\t\t// full SAT collision check\n\t\t\t\tif (\n\t\t\t\t\tSAT_LOOKUP[shapeA.type + shapeB.type].call(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tbodyA.ancestor, // a reference to the object A\n\t\t\t\t\t\tshapeA,\n\t\t\t\t\t\tbodyB.ancestor, // a reference to the object B\n\t\t\t\t\t\tshapeB,\n\t\t\t\t\t\t// clear response object before reusing\n\t\t\t\t\t\tresponse.clear(),\n\t\t\t\t\t) === true\n\t\t\t\t) {\n\t\t\t\t\t// set the shape index\n\t\t\t\t\tresponse.indexShapeA = indexA;\n\t\t\t\t\tresponse.indexShapeB = indexB;\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * find all the collisions for the specified object using a broadphase algorithm\n\t * @ignore\n\t * @param {Renderable|Container|Entity|Sprite|NineSliceSprite} objA - object to be tested for collision\n\t * @returns {boolean} in case of collision, false otherwise\n\t */\n\tcollisions(objA) {\n\t\tlet collisionCounter = 0;\n\t\t// retreive a list of potential colliding objects from the game world\n\t\tconst candidates = this.world.broadphase.retrieve(objA);\n\n\t\tboundsA.addBounds(objA.getBounds(), true);\n\t\tboundsA.addBounds(objA.body.getBounds());\n\n\t\tfor (let i = 0, len = candidates.length; i < len; i++) {\n\t\t\tconst objB = candidates[i];\n\t\t\t// check if both objects \"should\" collide\n\t\t\tif (this.shouldCollide(objA, objB)) {\n\t\t\t\tboundsB.addBounds(objB.getBounds(), true);\n\t\t\t\tboundsB.addBounds(objB.body.getBounds());\n\n\t\t\t\t// fast AABB check if both bounding boxes are overlaping\n\t\t\t\tif (boundsA.overlaps(boundsB)) {\n\t\t\t\t\tif (this.collides(objA.body, objB.body)) {\n\t\t\t\t\t\t// we touched something !\n\t\t\t\t\t\tcollisionCounter++;\n\n\t\t\t\t\t\t// execute the onCollision callback\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tobjA.onCollision &&\n\t\t\t\t\t\t\tobjA.onCollision(this.response, objB) !== false &&\n\t\t\t\t\t\t\tobjA.body.isStatic === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tobjA.body.respondToCollision.call(objA.body, this.response);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tobjB.onCollision &&\n\t\t\t\t\t\t\tobjB.onCollision(this.response, objA) !== false &&\n\t\t\t\t\t\t\tobjB.body.isStatic === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tobjB.body.respondToCollision.call(objB.body, this.response);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// for multi-shape bodies (e.g. polylines), resolve remaining\n\t\t\t\t\t\t// overlaps at segment junctions\n\t\t\t\t\t\tif (objA.body.shapes.length > 1 || objB.body.shapes.length > 1) {\n\t\t\t\t\t\t\tlet extraPasses = 3;\n\t\t\t\t\t\t\twhile (extraPasses-- > 0 && this.collides(objA.body, objB.body)) {\n\t\t\t\t\t\t\t\tconst overlap = this.response.overlapV;\n\t\t\t\t\t\t\t\tconst overlapN = this.response.overlapN;\n\n\t\t\t\t\t\t\t\t// correct position\n\t\t\t\t\t\t\t\tif (objA.body.isStatic === false) {\n\t\t\t\t\t\t\t\t\tobjA.body.ancestor.pos.sub(overlap);\n\t\t\t\t\t\t\t\t\t// cancel velocity into this surface (no bounce)\n\t\t\t\t\t\t\t\t\tconst projVel =\n\t\t\t\t\t\t\t\t\t\tobjA.body.vel.x * overlapN.x + objA.body.vel.y * overlapN.y;\n\t\t\t\t\t\t\t\t\tif (projVel > 0) {\n\t\t\t\t\t\t\t\t\t\tobjA.body.vel.x -= projVel * overlapN.x;\n\t\t\t\t\t\t\t\t\t\tobjA.body.vel.y -= projVel * overlapN.y;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (objB.body.isStatic === false) {\n\t\t\t\t\t\t\t\t\tobjB.body.ancestor.pos.add(overlap);\n\t\t\t\t\t\t\t\t\tconst projVel =\n\t\t\t\t\t\t\t\t\t\tobjB.body.vel.x * overlapN.x + objB.body.vel.y * overlapN.y;\n\t\t\t\t\t\t\t\t\tif (projVel > 0) {\n\t\t\t\t\t\t\t\t\t\tobjB.body.vel.x -= projVel * overlapN.x;\n\t\t\t\t\t\t\t\t\t\tobjB.body.vel.y -= projVel * overlapN.y;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// update bounds after position changed\n\t\t\t\t\t\t\t\tboundsA.addBounds(objA.getBounds(), true);\n\t\t\t\t\t\t\t\tboundsA.addBounds(objA.body.getBounds());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// we could return the amount of objects we collided with ?\n\t\treturn collisionCounter > 0;\n\t}\n\n\t/**\n\t * Checks for object colliding with the given line\n\t * @ignore\n\t * @param {Line} line - line to be tested for collision\n\t * @param {Array.<Renderable>} [result] - a user defined array that will be populated with intersecting physic objects.\n\t * @returns {Array.<Renderable>} an array of intersecting physic objects\n\t * @example\n\t * // define a line accross the viewport\n\t * let ray = new Line(\n\t * // absolute position of the line\n\t * 0, 0, [\n\t * // starting point relative to the initial position\n\t * new Vector2d(0, 0),\n\t * // ending point\n\t * new Vector2d(me.game.viewport.width, me.game.viewport.height)\n\t * ]);\n\t *\n\t * // check for collition\n\t * result = me.collision.rayCast(ray);\n\t *\n\t * if (result.length > 0) {\n\t * // ...\n\t * }\n\t */\n\trayCast(line, result = []) {\n\t\tlet collisionCounter = 0;\n\n\t\t// retrieve a list of potential colliding objects from the game world\n\t\tconst candidates = this.world.broadphase.retrieve(line);\n\n\t\tfor (let i = candidates.length, objB; i--, (objB = candidates[i]); ) {\n\t\t\t// fast AABB check if both bounding boxes are overlaping\n\t\t\tif (objB.body && line.getBounds().overlaps(objB.getBounds())) {\n\t\t\t\t// go trough all defined shapes in B (if any)\n\t\t\t\tconst bLen = objB.body.shapes.length;\n\t\t\t\tif (objB.body.shapes.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst shapeA = line;\n\n\t\t\t\t// go through all defined shapes in B\n\t\t\t\tlet indexB = 0;\n\t\t\t\tdo {\n\t\t\t\t\tconst shapeB = objB.body.getShape(indexB);\n\n\t\t\t\t\t// full SAT collision check\n\t\t\t\t\tif (\n\t\t\t\t\t\tSAT_LOOKUP[shapeA.type + shapeB.type].call(\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\tdummyObj, // a reference to the object A\n\t\t\t\t\t\t\tshapeA,\n\t\t\t\t\t\t\tobjB, // a reference to the object B\n\t\t\t\t\t\t\tshapeB,\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// we touched something !\n\t\t\t\t\t\tresult[collisionCounter] = objB;\n\t\t\t\t\t\tcollisionCounter++;\n\t\t\t\t\t}\n\t\t\t\t\tindexB++;\n\t\t\t\t} while (indexB < bLen);\n\t\t\t}\n\t\t}\n\n\t\t// cap result in case it was not empty\n\t\tresult.length = collisionCounter;\n\n\t\t// return the list of colliding objects\n\t\treturn result;\n\t}\n}\nexport default Detector;\n", "import { Vector2d } from \"../math/vector2d.ts\";\nimport { remove } from \"../utils/array.ts\";\n\n/**\n * @import World from \"./world.js\";\n * @import Container from \"./../renderable/container.js\";\n * @import {Bounds} from \"./bounds.ts\";\n */\n\n/*\n * A QuadTree implementation in JavaScript, a 2d spatial subdivision algorithm.\n * Based on the QuadTree Library by Timo Hausmann and released under the MIT license\n * https://github.com/timohausmann/quadtree-js/\n **/\n\n/**\n * a pool of `QuadTree` objects\n * @ignore\n */\nconst QT_ARRAY = [];\n\n/**\n * will pop a quadtree object from the array\n * or create a new one if the array is empty\n * @ignore\n */\nfunction QT_ARRAY_POP(\n\tworld,\n\tbounds,\n\tmax_objects = 4,\n\tmax_levels = 4,\n\tlevel = 0,\n) {\n\tif (QT_ARRAY.length > 0) {\n\t\tconst _qt = QT_ARRAY.pop();\n\t\t_qt.world = world;\n\t\t_qt.bounds = bounds;\n\t\t_qt.max_objects = max_objects;\n\t\t_qt.max_levels = max_levels;\n\t\t_qt.level = level;\n\t\treturn _qt;\n\t} else {\n\t\treturn new QuadTree(world, bounds, max_objects, max_levels, level);\n\t}\n}\n\n/**\n * Push back a quadtree back into the array\n * @ignore\n */\nfunction QT_ARRAY_PUSH(qt) {\n\tQT_ARRAY.push(qt);\n}\n\n/**\n * a temporary vector object to be reused\n * @ignore\n */\nconst QT_VECTOR = new Vector2d();\n\n/**\n * a QuadTree implementation in JavaScript, a 2d spatial subdivision algorithm.\n * @see game.world.broadphase\n */\nexport default class QuadTree {\n\t/**\n\t * @param {World} world - the physic world this QuadTree belongs to\n\t * @param {Bounds} bounds - bounds of the node\n\t * @param {number} [max_objects=4] - max objects a node can hold before splitting into 4 subnodes\n\t * @param {number} [max_levels=4] - total max levels inside root Quadtree\n\t * @param {number} [level] - deepth level, required for subnodes\n\t */\n\tconstructor(world, bounds, max_objects = 4, max_levels = 4, level = 0) {\n\t\tthis.world = world;\n\t\tthis.bounds = bounds;\n\n\t\tthis.max_objects = max_objects;\n\t\tthis.max_levels = max_levels;\n\n\t\tthis.level = level;\n\n\t\tthis.objects = [];\n\t\tthis.nodes = [];\n\t}\n\n\t/*\n\t * Split the node into 4 subnodes\n\t */\n\tsplit() {\n\t\tconst nextLevel = this.level + 1;\n\t\tconst subWidth = this.bounds.width / 2;\n\t\tconst subHeight = this.bounds.height / 2;\n\t\tconst left = this.bounds.left;\n\t\tconst top = this.bounds.top;\n\n\t\t//top right node\n\t\tthis.nodes[0] = QT_ARRAY_POP(\n\t\t\tthis.world,\n\t\t\t{\n\t\t\t\tleft: left + subWidth,\n\t\t\t\ttop: top,\n\t\t\t\twidth: subWidth,\n\t\t\t\theight: subHeight,\n\t\t\t},\n\t\t\tthis.max_objects,\n\t\t\tthis.max_levels,\n\t\t\tnextLevel,\n\t\t);\n\n\t\t//top left node\n\t\tthis.nodes[1] = QT_ARRAY_POP(\n\t\t\tthis.world,\n\t\t\t{\n\t\t\t\tleft: left,\n\t\t\t\ttop: top,\n\t\t\t\twidth: subWidth,\n\t\t\t\theight: subHeight,\n\t\t\t},\n\t\t\tthis.max_objects,\n\t\t\tthis.max_levels,\n\t\t\tnextLevel,\n\t\t);\n\n\t\t//bottom left node\n\t\tthis.nodes[2] = QT_ARRAY_POP(\n\t\t\tthis.world,\n\t\t\t{\n\t\t\t\tleft: left,\n\t\t\t\ttop: top + subHeight,\n\t\t\t\twidth: subWidth,\n\t\t\t\theight: subHeight,\n\t\t\t},\n\t\t\tthis.max_objects,\n\t\t\tthis.max_levels,\n\t\t\tnextLevel,\n\t\t);\n\n\t\t//bottom right node\n\t\tthis.nodes[3] = QT_ARRAY_POP(\n\t\t\tthis.world,\n\t\t\t{\n\t\t\t\tleft: left + subWidth,\n\t\t\t\ttop: top + subHeight,\n\t\t\t\twidth: subWidth,\n\t\t\t\theight: subHeight,\n\t\t\t},\n\t\t\tthis.max_objects,\n\t\t\tthis.max_levels,\n\t\t\tnextLevel,\n\t\t);\n\t}\n\n\t/*\n\t * Determine which node the object belongs to\n\t * @param {Rect} rect bounds of the area to be checked\n\t * @returns Integer index of the subnode (0-3), or -1 if rect cannot completely fit within a subnode and is part of the parent node\n\t */\n\tgetIndex(item) {\n\t\tlet pos;\n\t\tconst bounds = item.getBounds();\n\n\t\t// use game world coordinates for floating items\n\t\tif (item.isFloating === true) {\n\t\t\tpos = this.world.app.viewport.localToWorld(\n\t\t\t\tbounds.left,\n\t\t\t\tbounds.top,\n\t\t\t\tQT_VECTOR,\n\t\t\t);\n\t\t} else {\n\t\t\tpos = QT_VECTOR.set(item.left, item.top);\n\t\t}\n\n\t\tlet index = -1;\n\t\tconst rx = pos.x;\n\t\tconst ry = pos.y;\n\t\tconst rw = bounds.width;\n\t\tconst rh = bounds.height;\n\t\tconst verticalMidpoint = this.bounds.left + this.bounds.width / 2;\n\t\tconst horizontalMidpoint = this.bounds.top + this.bounds.height / 2;\n\t\t//rect can completely fit within the top quadrants\n\t\tconst topQuadrant = ry < horizontalMidpoint && ry + rh < horizontalMidpoint;\n\t\t//rect can completely fit within the bottom quadrants\n\t\tconst bottomQuadrant = ry > horizontalMidpoint;\n\n\t\t//rect can completely fit within the left quadrants\n\t\tif (rx < verticalMidpoint && rx + rw < verticalMidpoint) {\n\t\t\tif (topQuadrant) {\n\t\t\t\tindex = 1;\n\t\t\t} else if (bottomQuadrant) {\n\t\t\t\tindex = 2;\n\t\t\t}\n\t\t} else if (rx > verticalMidpoint) {\n\t\t\t//rect can completely fit within the right quadrants\n\t\t\tif (topQuadrant) {\n\t\t\t\tindex = 0;\n\t\t\t} else if (bottomQuadrant) {\n\t\t\t\tindex = 3;\n\t\t\t}\n\t\t}\n\n\t\treturn index;\n\t}\n\n\t/**\n\t * Insert the given object container into the node.\n\t * @param {Container} container - group of objects to be added\n\t */\n\tinsertContainer(container) {\n\t\tconst children = container.children;\n\t\tconst childrenLength = children.length;\n\t\tfor (let i = childrenLength, child; i--, (child = children[i]); ) {\n\t\t\tif (child.isKinematic !== true) {\n\t\t\t\tif (typeof child.addChild === \"function\") {\n\t\t\t\t\tif (child.name !== \"rootContainer\") {\n\t\t\t\t\t\tthis.insert(child);\n\t\t\t\t\t}\n\t\t\t\t\t// recursivly insert all childs\n\t\t\t\t\tthis.insertContainer(child);\n\t\t\t\t} else {\n\t\t\t\t\t// only insert object with a bounding box\n\t\t\t\t\t// Probably redundant with `isKinematic`\n\t\t\t\t\tif (typeof child.getBounds === \"function\") {\n\t\t\t\t\t\tthis.insert(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Insert the given object into the node. If the node\n\t * exceeds the capacity, it will split and add all\n\t * objects to their corresponding subnodes.\n\t * @param {object} item - object to be added\n\t */\n\tinsert(item) {\n\t\tlet index = -1;\n\n\t\t//if we have subnodes ...\n\t\tif (this.nodes.length > 0) {\n\t\t\tindex = this.getIndex(item);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.nodes[index].insert(item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.objects.push(item);\n\n\t\tif (\n\t\t\tthis.objects.length > this.max_objects &&\n\t\t\tthis.level < this.max_levels\n\t\t) {\n\t\t\t//split if we don't already have subnodes\n\t\t\tif (this.nodes.length === 0) {\n\t\t\t\tthis.split();\n\t\t\t}\n\n\t\t\t//add all objects to their corresponding subnodes\n\t\t\tconst remaining = [];\n\t\t\tfor (let i = 0, len = this.objects.length; i < len; i++) {\n\t\t\t\tindex = this.getIndex(this.objects[i]);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tthis.nodes[index].insert(this.objects[i]);\n\t\t\t\t} else {\n\t\t\t\t\tremaining.push(this.objects[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.objects = remaining;\n\t\t}\n\t}\n\n\t/**\n\t * Return all objects that could collide with the given object\n\t * @param {object} item - object to be checked against\n\t * @param {object} [fn] - a sorting function for the returned array\n\t * @returns {object[]} array with all detected objects\n\t */\n\tretrieve(item, fn, result) {\n\t\t// reuse or create a result array to avoid concat allocations\n\t\tconst isRoot = typeof result === \"undefined\";\n\t\tif (isRoot) {\n\t\t\tresult = [];\n\t\t}\n\n\t\t// add objects at this level\n\t\tconst objects = this.objects;\n\t\tfor (let i = 0, len = objects.length; i < len; i++) {\n\t\t\tresult.push(objects[i]);\n\t\t}\n\n\t\t//if we have subnodes ...\n\t\tif (this.nodes.length > 0) {\n\t\t\tconst index = this.getIndex(item);\n\n\t\t\t//if rect fits into a subnode ..\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.nodes[index].retrieve(item, undefined, result);\n\t\t\t} else {\n\t\t\t\t//if rect does not fit into a subnode, check it against all subnodes\n\t\t\t\tfor (let i = 0; i < this.nodes.length; i++) {\n\t\t\t\t\tthis.nodes[i].retrieve(item, undefined, result);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isRoot && typeof fn === \"function\") {\n\t\t\tresult.sort(fn);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Remove the given item from the quadtree.\n\t * (this function won't recalculate the impacted node)\n\t * @param {object} item - object to be removed\n\t * @returns {boolean} true if the item was found and removed.\n\t */\n\tremove(item) {\n\t\tlet found = false;\n\n\t\tif (typeof item.getBounds === \"undefined\") {\n\t\t\t// ignore object that cannot be added in the first place\n\t\t\treturn false;\n\t\t}\n\n\t\t//if we have subnodes ...\n\t\tif (this.nodes.length > 0) {\n\t\t\t// determine to which node the item belongs to\n\t\t\tconst index = this.getIndex(item);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tfound = remove(this.nodes[index], item);\n\t\t\t\t// trim node if empty\n\t\t\t\tif (found && this.nodes[index].isPrunable()) {\n\t\t\t\t\tthis.nodes.splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (found === false) {\n\t\t\t// try and remove the item from the list of items in this node\n\t\t\tif (this.objects.indexOf(item) !== -1) {\n\t\t\t\tremove(this.objects, item);\n\t\t\t\tfound = true;\n\t\t\t}\n\t\t}\n\n\t\treturn found;\n\t}\n\n\t/**\n\t * return true if the node is prunable\n\t * @returns {boolean} true if the node is prunable\n\t */\n\tisPrunable() {\n\t\treturn !(this.hasChildren() || this.objects.length > 0);\n\t}\n\n\t/**\n\t * return true if the node has any children\n\t * @returns {boolean} true if the node has any children\n\t */\n\thasChildren() {\n\t\tfor (let i = 0; i < this.nodes.length; i = i + 1) {\n\t\t\tconst subnode = this.nodes[i];\n\t\t\tif (subnode.length > 0 || subnode.objects.length > 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * clear the quadtree\n\t * @param {Bounds} [bounds=this.bounds] - the bounds to be cleared\n\t */\n\tclear(bounds) {\n\t\tthis.objects.length = 0;\n\n\t\tfor (let i = 0; i < this.nodes.length; i++) {\n\t\t\tthis.nodes[i].clear();\n\t\t\t// recycle the quadTree object\n\t\t\tQT_ARRAY_PUSH(this.nodes[i]);\n\t\t}\n\t\t// empty the array\n\t\tthis.nodes.length = 0;\n\n\t\t// resize the root bounds if required\n\t\tif (typeof bounds !== \"undefined\") {\n\t\t\tthis.bounds.setMinMax(\n\t\t\t\tbounds.min.x,\n\t\t\t\tbounds.min.y,\n\t\t\t\tbounds.max.x,\n\t\t\t\tbounds.max.y,\n\t\t\t);\n\t\t}\n\t}\n}\n", "import { hasRegisteredEvents } from \"../input/pointerevent.js\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport Container from \"../renderable/container.js\";\nimport state from \"./../state/state.js\";\nimport {\n\teventEmitter,\n\tGAME_RESET,\n\tLEVEL_LOADED,\n\tWORLD_STEP,\n} from \"../system/event.ts\";\nimport { collision } from \"./collision.js\";\nimport Detector from \"./detector.js\";\nimport QuadTree from \"./quadtree.js\";\n\n/**\n * @import Application from \"./../application/application.js\";\n * @import Body from \"./body.js\";\n */\n\n/**\n * an object representing the physic world, and responsible for managing and updating all childs and physics\n */\nexport default class World extends Container {\n\t/**\n\t * @param {number} [x=0] - position of the container (accessible via the inherited pos.x property)\n\t * @param {number} [y=0] - position of the container (accessible via the inherited pos.y property)\n\t * @param {number} [width=game.viewport.width] - width of the container\n\t * @param {number} [height=game.viewport.height] - height of the container\n\t */\n\tconstructor(x = 0, y = 0, width = Infinity, height = Infinity) {\n\t\t// call the super constructor\n\t\tsuper(x, y, width, height, true);\n\n\t\t// world is the root container\n\t\tthis.name = \"rootContainer\";\n\n\t\t// to mimic the previous behavior\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t/**\n\t\t * the application (game) this physic world belong to\n\t\t * @type {Application}\n\t\t */\n\t\tthis.app = undefined;\n\n\t\t/**\n\t\t * the physic engine used by melonJS\n\t\t * @see ApplicationSettings.physic\n\t\t * @type {string}\n\t\t * @default \"builtin\"\n\t\t * @example\n\t\t * // disable builtin physic\n\t\t * me.game.world.physic = \"none\";\n\t\t */\n\t\tthis.physic = \"builtin\";\n\n\t\t/**\n\t\t * the rate at which the game world is updated,\n\t\t * may be greater than or lower than the display fps\n\t\t * @default 60\n\t\t * @see timer.maxfps\n\t\t */\n\t\tthis.fps = 60;\n\n\t\t/**\n\t\t * world gravity\n\t\t * @type {Vector2d}\n\t\t * @default <0,0.98>\n\t\t */\n\t\tthis.gravity = new Vector2d(0, 0.98);\n\n\t\t/**\n\t\t * Enabled pre-rendering for all tile layers. <br>\n\t\t * If false layers are rendered dynamically, if true layers are first fully rendered into an offscreen canvas.<br>\n\t\t * the \"best\" rendering method depends of your game (amount of layer, layer size, amount of tiles per layer, etc.)<br>\n\t\t * Note : rendering method is also configurable per layer by adding a boolean \"preRender\" property to your layer in Tiled ({@link https://doc.mapeditor.org/en/stable/manual/custom-properties/#adding-properties}).\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.preRender = false;\n\n\t\t/**\n\t\t * the active physic bodies in this simulation\n\t\t * @type {Set<Body>}\n\t\t */\n\t\tthis.bodies = new Set();\n\n\t\t/**\n\t\t * the instance of the game world quadtree used for broadphase (used by the builtin physic and pointer event implementation)\n\t\t * @type {QuadTree}\n\t\t */\n\t\tthis.broadphase = new QuadTree(\n\t\t\tthis,\n\t\t\tthis.getBounds().clone(),\n\t\t\tcollision.maxChildren,\n\t\t\tcollision.maxDepth,\n\t\t);\n\n\t\t/**\n\t\t * the collision detector instance used by this world instance\n\t\t * @type {Detector}\n\t\t */\n\t\tthis.detector = new Detector(this);\n\n\t\t// reset the world container on the game reset signal\n\t\teventEmitter.addListener(GAME_RESET, this.reset.bind(this));\n\n\t\t// update the broadband world bounds if a new level is loaded\n\t\teventEmitter.addListener(LEVEL_LOADED, () => {\n\t\t\t// reset the quadtree\n\t\t\tthis.broadphase.clear(this.getBounds());\n\t\t});\n\t}\n\n\t/**\n\t * reset the game world\n\t */\n\treset() {\n\t\t// clear the quadtree\n\t\tthis.broadphase.clear();\n\n\t\t// reset the anchorPoint\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\t// call the parent method\n\t\tsuper.reset();\n\n\t\t// save persistent child bodies\n\t\tconst persistentBodies = [];\n\t\tthis.bodies.forEach((value) => {\n\t\t\tif (value.ancestor && value.ancestor.isPersistent) {\n\t\t\t\tpersistentBodies.push(value);\n\t\t\t}\n\t\t});\n\n\t\t// empty the list of active physic bodies\n\t\t// Note: this should be empty already when calling the parent method\n\t\tthis.bodies.clear();\n\n\t\t// insert persistent child bodies into the new state\n\t\tif (persistentBodies.length > 0) {\n\t\t\tpersistentBodies.forEach((body) => {\n\t\t\t\tthis.addBody(body);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Add a physic body to the game world\n\t * @see Container.addChild\n\t * @param {Body} body\n\t * @returns {World} this game world\n\t */\n\taddBody(body) {\n\t\t//add it to the list of active body if builtin physic is enabled\n\t\tif (this.physic === \"builtin\") {\n\t\t\tthis.bodies.add(body);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove a physic body from the game world\n\t * @see Container.removeChild\n\t * @param {Body} body\n\t * @returns {World} this game world\n\t */\n\tremoveBody(body) {\n\t\t//remove from the list of active body if builtin physic is enabled\n\t\tif (this.physic === \"builtin\") {\n\t\t\tthis.bodies.delete(body);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Apply gravity to the given body\n\t * @private\n\t * @param {Body} body\n\t */\n\tbodyApplyGravity(body) {\n\t\t// apply gravity to the current velocity\n\t\tif (!body.ignoreGravity && body.gravityScale !== 0) {\n\t\t\tconst gravity = this.gravity;\n\n\t\t\t// apply gravity if defined\n\t\t\tbody.force.x += body.mass * gravity.x * body.gravityScale;\n\t\t\tbody.force.y += body.mass * gravity.y * body.gravityScale;\n\t\t}\n\t}\n\n\t/**\n\t * update the game world\n\t * @param {number} dt - the time passed since the last frame update\n\t * @returns {boolean} true if the world is dirty\n\t */\n\tupdate(dt) {\n\t\t// only update the quadtree if necessary\n\t\tif (this.physic === \"builtin\" || hasRegisteredEvents() === true) {\n\t\t\t// clear the quadtree\n\t\t\tthis.broadphase.clear();\n\t\t\t// insert the world container (children) into the quadtree\n\t\t\tthis.broadphase.insertContainer(this);\n\t\t}\n\n\t\t// update the builtin physic simulation\n\t\tthis.step(dt);\n\n\t\t// call the super constructor\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * update the builtin physic simulation by one step (called by the game world update method)\n\t * @param {number} dt - the time passed since the last frame update\n\t */\n\tstep(dt) {\n\t\tif (this.physic === \"builtin\") {\n\t\t\tconst isPaused = state.isPaused();\n\t\t\t// iterate through all bodies\n\t\t\tfor (const body of this.bodies) {\n\t\t\t\tif (!body.isStatic) {\n\t\t\t\t\tconst ancestor = body.ancestor;\n\t\t\t\t\tif (!ancestor) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// if the game is not paused, and ancestor can be updated\n\t\t\t\t\tif (\n\t\t\t\t\t\t!(isPaused && !ancestor.updateWhenPaused) &&\n\t\t\t\t\t\t(ancestor.inViewport || ancestor.alwaysUpdate)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// apply gravity to this body\n\t\t\t\t\t\tthis.bodyApplyGravity(body);\n\t\t\t\t\t\t// body update function (this moves it)\n\t\t\t\t\t\tif (body.update(dt) === true) {\n\t\t\t\t\t\t\t// mark ancestor as dirty\n\t\t\t\t\t\t\tancestor.isDirty = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// handle collisions against other objects\n\t\t\t\t\t\tthis.detector.collisions(ancestor);\n\t\t\t\t\t\t// clear body force\n\t\t\t\t\t\tbody.force.set(0, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\teventEmitter.emit(WORLD_STEP, dt);\n\t}\n}\n", "varying vec4 vColor;\n\nvoid main(void) {\n gl_FragColor = vColor;\n}\n", "// Current vertex point\nattribute vec2 aVertex;\nattribute vec4 aColor;\n\n// Projection matrix\nuniform mat4 uProjectionMatrix;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n // Transform the vertex position by the projection matrix\n gl_Position = uProjectionMatrix * vec4(aVertex, 0.0, 1.0);\n // Pass the remaining attributes to the fragment shader\n vColor = vec4(aColor.bgr * aColor.a, aColor.a);\n}\n", "/**\n * a Vertex Buffer object\n * @ignore\n */\n\nexport default class VertexArrayBuffer {\n\tconstructor(vertex_size, vertex_per_obj) {\n\t\t// the size of one vertex in float\n\t\tthis.vertexSize = vertex_size;\n\t\t// size of an object in vertex\n\t\tthis.objSize = vertex_per_obj;\n\t\t// the maximum number of vertices the vertex array buffer can hold\n\t\tthis.maxVertex = 256; // (note: this seems to be the sweet spot performance-wise when using batching)\n\t\t// the current number of vertices added to the vertex array buffer\n\t\tthis.vertexCount = 0;\n\n\t\t// the actual vertex data buffer\n\t\tthis.buffer = new ArrayBuffer(\n\t\t\tthis.maxVertex * this.vertexSize * this.objSize,\n\t\t);\n\t\t// Float32 and Uint32 view of the vertex data array buffer\n\t\tthis.bufferF32 = new Float32Array(this.buffer);\n\t\tthis.bufferU32 = new Uint32Array(this.buffer);\n\t}\n\n\t/**\n\t * clear the vertex array buffer\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.vertexCount = 0;\n\t}\n\n\t/**\n\t * return true if full\n\t * @ignore\n\t */\n\tisFull(vertex = this.objSize) {\n\t\treturn this.vertexCount + vertex >= this.maxVertex;\n\t}\n\n\t/**\n\t * resize the vertex buffer, retaining its original contents\n\t * @ignore\n\t */\n\tresize(vertexCount) {\n\t\twhile (vertexCount > this.maxVertex) {\n\t\t\t// double the vertex size\n\t\t\tthis.maxVertex <<= 1;\n\t\t}\n\n\t\t// save a reference to the previous data\n\t\tconst data = this.bufferF32;\n\n\t\t// recreate ArrayBuffer and views\n\t\tthis.buffer = new ArrayBuffer(\n\t\t\tthis.maxVertex * this.vertexSize * this.objSize,\n\t\t);\n\t\tthis.bufferF32 = new Float32Array(this.buffer);\n\t\tthis.bufferU32 = new Uint32Array(this.buffer);\n\n\t\t// copy previous data\n\t\tthis.bufferF32.set(data);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * push a new vertex to the buffer\n\t * @ignore\n\t */\n\tpush(x, y, u, v, tint) {\n\t\tlet offset = this.vertexCount * this.vertexSize;\n\n\t\tif (this.vertexCount >= this.maxVertex) {\n\t\t\tthis.resize(this.vertexCount);\n\t\t}\n\n\t\tthis.bufferF32[offset] = x;\n\t\tthis.bufferF32[++offset] = y;\n\n\t\tif (typeof u !== \"undefined\") {\n\t\t\tthis.bufferF32[++offset] = u;\n\t\t\tthis.bufferF32[++offset] = v;\n\t\t}\n\n\t\tif (typeof tint !== \"undefined\") {\n\t\t\tthis.bufferU32[++offset] = tint;\n\t\t}\n\n\t\tthis.vertexCount++;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * return a reference to the data in Float32 format\n\t * @ignore\n\t */\n\ttoFloat32(begin, end) {\n\t\tif (typeof end !== \"undefined\") {\n\t\t\treturn this.bufferF32.subarray(begin, end);\n\t\t} else {\n\t\t\treturn this.bufferF32;\n\t\t}\n\t}\n\n\t/**\n\t * return a reference to the data in Uint32 format\n\t * @ignore\n\t */\n\ttoUint32(begin, end) {\n\t\tif (typeof end !== \"undefined\") {\n\t\t\treturn this.bufferU32.subarray(begin, end);\n\t\t} else {\n\t\t\treturn this.bufferU32;\n\t\t}\n\t}\n\n\t/**\n\t * return the size of the vertex in vertex\n\t * @ignore\n\t */\n\tlength() {\n\t\treturn this.vertexCount;\n\t}\n\n\t/**\n\t * return true if empty\n\t * @ignore\n\t */\n\tisEmpty() {\n\t\treturn this.vertexCount === 0;\n\t}\n}\n", "import VertexArrayBuffer from \"../buffer/vertex.js\";\nimport GLShader from \"../glshader.js\";\n\n/**\n * additional import for TypeScript\n * @import WebGLRenderer from \"./../webgl_renderer.js\";\n * @import {Matrix3d} from \"../../../math/matrix3d.ts\";\n */\n\n/**\n * A base Compositor object.\n */\nexport default class Compositor {\n\t/**\n\t * @param {WebGLRenderer} renderer - the current WebGL renderer session\n\t * @param {object} settings - additional settings to initialize this compositors\n\t * @param {object[]} settings.attribute - an array of attributes definition\n\t * @param {string} settings.attribute.name - name of the attribute in the vertex shader\n\t * @param {number} settings.attribute.size - number of components per vertex attribute. Must be 1, 2, 3, or 4.\n\t * @param {GLenum} settings.attribute.type - data type of each component in the array\n\t * @param {boolean} settings.attribute.normalized - whether integer data values should be normalized into a certain range when being cast to a float\n\t * @param {number} settings.attribute.offset - offset in bytes of the first component in the vertex attribute array\n\t * @param {object} settings.shader - an array of attributes definition\n\t * @param {string} settings.shader.vertex - a string containing the GLSL source code to set\n\t * @param {string} settings.shader.fragment - a string containing the GLSL source code to set\n\t */\n\tconstructor(renderer, settings) {\n\t\tthis.init(renderer, settings);\n\t}\n\n\t/**\n\t * Initialize the compositor\n\t * @ignore\n\t */\n\tinit(renderer, settings) {\n\t\t// the associated renderer\n\t\tthis.renderer = renderer;\n\n\t\t// WebGL context\n\t\tthis.gl = renderer.gl;\n\n\t\t// Global fill color\n\t\tthis.color = renderer.currentColor;\n\n\t\t// Global transformation matrix\n\t\tthis.viewMatrix = renderer.currentTransform;\n\n\t\t/**\n\t\t * the default shader created by this compositor\n\t\t * @type {GLShader}\n\t\t */\n\t\tthis.defaultShader = undefined;\n\n\t\t/**\n\t\t * the shader currently used by this compositor\n\t\t * @type {GLShader}\n\t\t */\n\t\tthis.currentShader = undefined;\n\n\t\t/**\n\t\t * primitive type to render (gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN, gl.TRIANGLES)\n\t\t * @type {number}\n\t\t * @default gl.TRIANGLES\n\t\t */\n\t\tthis.mode = this.gl.TRIANGLES;\n\n\t\t/**\n\t\t * an array of vertex attribute properties\n\t\t * @see WebGLCompositor.addAttribute\n\t\t * @type {Array.<Object>}\n\t\t */\n\t\tthis.attributes = [];\n\n\t\t/**\n\t\t * the size of a single vertex in bytes\n\t\t * (will automatically be calculated as attributes definitions are added)\n\t\t * @see WebGLCompositor.addAttribute\n\t\t * @type {number}\n\t\t */\n\t\tthis.vertexByteSize = 0;\n\n\t\t/**\n\t\t * the size of a single vertex in floats\n\t\t * (will automatically be calculated as attributes definitions are added)\n\t\t * @see WebGLCompositor.addAttribute\n\t\t * @type {number}\n\t\t */\n\t\tthis.vertexSize = 0;\n\n\t\t/**\n\t\t * the vertex data buffer used by this compositor\n\t\t * @type {VertexArrayBuffer}\n\t\t */\n\t\tthis.vertexData = null;\n\n\t\t// parse given attibrutes\n\t\tif (typeof settings !== \"undefined\" && Array.isArray(settings.attributes)) {\n\t\t\tsettings.attributes.forEach((attr) => {\n\t\t\t\tthis.addAttribute(\n\t\t\t\t\tattr.name,\n\t\t\t\t\tattr.size,\n\t\t\t\t\tattr.type,\n\t\t\t\t\tattr.normalized,\n\t\t\t\t\tattr.offset,\n\t\t\t\t);\n\t\t\t\tthis.vertexData = new VertexArrayBuffer(this.vertexSize, 6);\n\t\t\t});\n\t\t} else {\n\t\t\tthrow new Error(\"attributes definition missing\");\n\t\t}\n\n\t\t// parse and instantiate the default shader\n\t\tif (\n\t\t\ttypeof settings !== \"undefined\" &&\n\t\t\ttypeof settings.shader !== \"undefined\"\n\t\t) {\n\t\t\tthis.defaultShader = new GLShader(\n\t\t\t\tthis.gl,\n\t\t\t\tsettings.shader.vertex,\n\t\t\t\tsettings.shader.fragment,\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new Error(\"shader definition missing\");\n\t\t}\n\t}\n\n\t/**\n\t * Reset compositor internal state\n\t * @ignore\n\t */\n\treset() {\n\t\t// WebGL context\n\t\tthis.gl = this.renderer.gl;\n\n\t\t// clear the vertex data buffer\n\t\tthis.vertexData.clear();\n\t}\n\n\t/**\n\t * called by the WebGL renderer when a compositor become the current one\n\t */\n\tbind() {\n\t\tif (this.renderer.currentProgram !== this.defaultShader.program) {\n\t\t\tthis.useShader(this.defaultShader);\n\t\t}\n\t}\n\n\t/**\n\t * Select the shader to use for compositing\n\t * @see GLShader\n\t * @param {GLShader} shader - a reference to a GLShader instance\n\t */\n\tuseShader(shader) {\n\t\tif (this.renderer.currentProgram !== shader.program) {\n\t\t\tthis.flush();\n\t\t\tshader.bind();\n\t\t\tshader.setUniform(\"uProjectionMatrix\", this.renderer.projectionMatrix);\n\t\t\tshader.setVertexAttributes(this.gl, this.attributes, this.vertexByteSize);\n\n\t\t\tthis.currentShader = shader;\n\t\t\tthis.renderer.currentProgram = this.currentShader.program;\n\t\t}\n\t}\n\n\t/**\n\t * add vertex attribute property definition to the compositor\n\t * @param {string} name - name of the attribute in the vertex shader\n\t * @param {number} size - number of components per vertex attribute. Must be 1, 2, 3, or 4.\n\t * @param {GLenum} type - data type of each component in the array\n\t * @param {boolean} normalized - whether integer data values should be normalized into a certain range when being cast to a float\n\t * @param {number} offset - offset in bytes of the first component in the vertex attribute array\n\t */\n\taddAttribute(name, size, type, normalized, offset) {\n\t\tthis.attributes.push({\n\t\t\tname: name,\n\t\t\tsize: size,\n\t\t\ttype: type,\n\t\t\tnormalized: normalized,\n\t\t\toffset: offset,\n\t\t});\n\n\t\tswitch (type) {\n\t\t\tcase this.gl.BYTE:\n\t\t\t\tthis.vertexByteSize += size * Int8Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.UNSIGNED_BYTE:\n\t\t\t\tthis.vertexByteSize += size * Uint8Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.SHORT:\n\t\t\t\tthis.vertexByteSize += size * Int16Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.UNSIGNED_SHORT:\n\t\t\t\tthis.vertexByteSize += size * Uint16Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.INT:\n\t\t\t\tthis.vertexByteSize += size * Int32Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.UNSIGNED_INT:\n\t\t\t\tthis.vertexByteSize += size * Uint32Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tcase this.gl.FLOAT:\n\t\t\t\tthis.vertexByteSize += size * Float32Array.BYTES_PER_ELEMENT;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Invalid GL Attribute type\");\n\t\t}\n\t\tthis.vertexSize = this.vertexByteSize / Float32Array.BYTES_PER_ELEMENT;\n\t}\n\n\t/**\n\t * set/change the current projection matrix\n\t * @param {Matrix3d} matrix - the new projection matrix\n\t */\n\tsetProjection(matrix) {\n\t\tthis.currentShader.setUniform(\"uProjectionMatrix\", matrix);\n\t}\n\n\t/**\n\t * Flush batched vertex data to the GPU\n\t * @param {number} [mode=gl.TRIANGLES] - the GL drawing mode\n\t */\n\tflush(mode = this.mode) {\n\t\tconst vertex = this.vertexData;\n\t\tconst vertexCount = vertex.vertexCount;\n\n\t\tif (vertexCount > 0) {\n\t\t\tconst gl = this.gl;\n\t\t\tconst vertexSize = vertex.vertexSize;\n\n\t\t\t// Copy data into stream buffer\n\t\t\tif (this.renderer.WebGLVersion > 1) {\n\t\t\t\tgl.bufferData(\n\t\t\t\t\tgl.ARRAY_BUFFER,\n\t\t\t\t\tvertex.toFloat32(),\n\t\t\t\t\tgl.STREAM_DRAW,\n\t\t\t\t\t0,\n\t\t\t\t\tvertexCount * vertexSize,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.bufferData(\n\t\t\t\t\tgl.ARRAY_BUFFER,\n\t\t\t\t\tvertex.toFloat32(0, vertexCount * vertexSize),\n\t\t\t\t\tgl.STREAM_DRAW,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tgl.drawArrays(mode, 0, vertexCount);\n\n\t\t\t// clear the vertex buffer\n\t\t\tvertex.clear();\n\t\t}\n\t}\n}\n", "import primitiveFragment from \"./../shaders/primitive.frag\";\nimport primitiveVertex from \"./../shaders/primitive.vert\";\nimport Compositor from \"./compositor.js\";\n\n/**\n * additional import for TypeScript\n * @import {Point} from \"./../../../geometries/point.ts\";\n */\n\n/**\n * A WebGL Compositor object. This class handles all of the WebGL state<br>\n * Pushes texture regions or shape geometry into WebGL buffers, automatically flushes to GPU\n */\nexport default class PrimitiveCompositor extends Compositor {\n\t/**\n\t * Initialize the compositor\n\t * @ignore\n\t */\n\tinit(renderer) {\n\t\tsuper.init(renderer, {\n\t\t\tattributes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"aVertex\",\n\t\t\t\t\tsize: 2,\n\t\t\t\t\ttype: renderer.gl.FLOAT,\n\t\t\t\t\tnormalized: false,\n\t\t\t\t\toffset: 0 * Float32Array.BYTES_PER_ELEMENT,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"aColor\",\n\t\t\t\t\tsize: 4,\n\t\t\t\t\ttype: renderer.gl.UNSIGNED_BYTE,\n\t\t\t\t\tnormalized: true,\n\t\t\t\t\toffset: 2 * Float32Array.BYTES_PER_ELEMENT,\n\t\t\t\t},\n\t\t\t],\n\t\t\tshader: {\n\t\t\t\tvertex: primitiveVertex,\n\t\t\t\tfragment: primitiveFragment,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Draw an array of vertices\n\t * @param {GLenum} mode - primitive type to render (gl.POINTS, gl.LINE_STRIP, gl.LINE_LOOP, gl.LINES, gl.TRIANGLE_STRIP, gl.TRIANGLE_FAN, gl.TRIANGLES)\n\t * @param {Point[]} verts - an array of vertices\n\t * @param {number} [vertexCount=verts.length] - amount of points defined in the points array\n\t */\n\tdrawVertices(mode, verts, vertexCount = verts.length) {\n\t\tconst viewMatrix = this.viewMatrix;\n\t\tconst vertexData = this.vertexData;\n\t\tconst alpha = this.renderer.getGlobalAlpha();\n\t\tconst colorUint32 = this.renderer.currentColor.toUint32(alpha);\n\n\t\tif (vertexData.isFull(vertexCount)) {\n\t\t\t// is the vertex buffer full if we add more vertices\n\t\t\tthis.flush();\n\t\t}\n\n\t\t// flush if drawing vertices with a different drawing mode\n\t\tif (mode !== this.mode) {\n\t\t\tthis.flush(this.mode);\n\t\t\tthis.mode = mode;\n\t\t}\n\n\t\tif (!viewMatrix.isIdentity()) {\n\t\t\tverts.forEach((vert) => {\n\t\t\t\tviewMatrix.apply(vert);\n\t\t\t\tvertexData.push(vert.x, vert.y, undefined, undefined, colorUint32);\n\t\t\t});\n\t\t} else {\n\t\t\tverts.forEach((vert) => {\n\t\t\t\tvertexData.push(vert.x, vert.y, undefined, undefined, colorUint32);\n\t\t\t});\n\t\t}\n\n\t\t// force flush for primitive using LINE_STRIP or LINE_LOOP\n\t\tif (this.mode === this.gl.LINE_STRIP || this.mode === this.gl.LINE_LOOP) {\n\t\t\tthis.flush(this.mode);\n\t\t}\n\t}\n}\n", "uniform sampler2D uSampler;\nvarying vec4 vColor;\nvarying vec2 vRegion;\n\nvoid main(void) {\n gl_FragColor = texture2D(uSampler, vRegion) * vColor;\n}\n", "// Current vertex point\nattribute vec2 aVertex;\nattribute vec2 aRegion;\nattribute vec4 aColor;\n\n// Projection matrix\nuniform mat4 uProjectionMatrix;\n\nvarying vec2 vRegion;\nvarying vec4 vColor;\n\nvoid main(void) {\n // Transform the vertex position by the projection matrix\n gl_Position = uProjectionMatrix * vec4(aVertex, 0.0, 1.0);\n // Pass the remaining attributes to the fragment shader\n vColor = vec4(aColor.bgr * aColor.a, aColor.a);\n vRegion = aRegion;\n}\n", "import { isPowerOfTwo } from \"../../../math/math.ts\";\nimport { Vector2d } from \"../../../math/vector2d.ts\";\nimport quadFragment from \"./../shaders/quad.frag\";\nimport quadVertex from \"./../shaders/quad.vert\";\nimport Compositor from \"./compositor.js\";\n\n/**\n * additional import for TypeScript\n * @import {TextureAtlas} from \"./../../texture/atlas.js\";\n */\n\n// a pool of resuable vectors\nconst V_ARRAY = [\n\tnew Vector2d(),\n\tnew Vector2d(),\n\tnew Vector2d(),\n\tnew Vector2d(),\n];\n\n/**\n * A WebGL Compositor object. This class handles all of the WebGL state<br>\n * Pushes texture regions or shape geometry into WebGL buffers, automatically flushes to GPU\n */\nexport default class QuadCompositor extends Compositor {\n\t/**\n\t * Initialize the compositor\n\t * @ignore\n\t */\n\tinit(renderer) {\n\t\tsuper.init(renderer, {\n\t\t\tattributes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"aVertex\",\n\t\t\t\t\tsize: 2,\n\t\t\t\t\ttype: renderer.gl.FLOAT,\n\t\t\t\t\tnormalized: false,\n\t\t\t\t\toffset: 0 * Float32Array.BYTES_PER_ELEMENT,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"aRegion\",\n\t\t\t\t\tsize: 2,\n\t\t\t\t\ttype: renderer.gl.FLOAT,\n\t\t\t\t\tnormalized: false,\n\t\t\t\t\toffset: 2 * Float32Array.BYTES_PER_ELEMENT,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"aColor\",\n\t\t\t\t\tsize: 4,\n\t\t\t\t\ttype: renderer.gl.UNSIGNED_BYTE,\n\t\t\t\t\tnormalized: true,\n\t\t\t\t\toffset: 4 * Float32Array.BYTES_PER_ELEMENT,\n\t\t\t\t},\n\t\t\t],\n\t\t\tshader: {\n\t\t\t\tvertex: quadVertex,\n\t\t\t\tfragment: quadFragment,\n\t\t\t},\n\t\t});\n\n\t\t// list of active texture units\n\t\tthis.currentTextureUnit = -1;\n\t\tthis.boundTextures = [];\n\t}\n\n\t/**\n\t * Reset compositor internal state\n\t * @ignore\n\t */\n\treset() {\n\t\tsuper.reset();\n\n\t\t// delete all related bound texture\n\t\tfor (let i = 0; i < this.renderer.maxTextures; i++) {\n\t\t\tconst texture2D = this.getTexture2D(i);\n\t\t\tif (typeof texture2D !== \"undefined\") {\n\t\t\t\tthis.deleteTexture2D(texture2D);\n\t\t\t}\n\t\t}\n\t\tthis.currentTextureUnit = -1;\n\t}\n\n\t/**\n\t * Create a WebGL texture from an image\n\t * @param {number} unit - Destination texture unit\n\t * @param {Image|HTMLCanvasElement|ImageData|Uint8Array[]|Float32Array[]} [pixels=null] - Source image\n\t * @param {number} filter - gl.LINEAR or gl.NEAREST\n\t * @param {string} [repeat=\"no-repeat\"] - Image repeat behavior (see {@link ImageLayer#repeat})\n\t * @param {number} [w=pixels.width] - Source image width (Only use with UInt8Array[] or Float32Array[] source image)\n\t * @param {number} [h=pixels.height] - Source image height (Only use with UInt8Array[] or Float32Array[] source image)\n\t * @param {boolean} [premultipliedAlpha=true] - Multiplies the alpha channel into the other color channels\n\t * @param {boolean} [mipmap=true] - Whether mipmap levels should be generated for this texture\n\t * @returns {WebGLTexture} a WebGL texture\n\t */\n\tcreateTexture2D(\n\t\tunit,\n\t\tpixels = null,\n\t\tfilter,\n\t\trepeat = \"no-repeat\",\n\t\tw = pixels.width,\n\t\th = pixels.height,\n\t\tpremultipliedAlpha = true,\n\t\tmipmap = true,\n\t\ttexture,\n\t) {\n\t\tconst gl = this.gl;\n\t\tconst isPOT = isPowerOfTwo(w) && isPowerOfTwo(h);\n\t\tconst rs =\n\t\t\trepeat.search(/^repeat(-x)?$/) === 0 &&\n\t\t\t(isPOT || this.renderer.WebGLVersion > 1)\n\t\t\t\t? gl.REPEAT\n\t\t\t\t: gl.CLAMP_TO_EDGE;\n\t\tconst rt =\n\t\t\trepeat.search(/^repeat(-y)?$/) === 0 &&\n\t\t\t(isPOT || this.renderer.WebGLVersion > 1)\n\t\t\t\t? gl.REPEAT\n\t\t\t\t: gl.CLAMP_TO_EDGE;\n\n\t\tlet currentTexture = texture;\n\t\tif (!currentTexture) {\n\t\t\tcurrentTexture = gl.createTexture();\n\t\t}\n\n\t\tthis.bindTexture2D(currentTexture, unit);\n\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, rs);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, rt);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n\n\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultipliedAlpha);\n\n\t\tif (pixels === null || typeof pixels.byteLength !== \"undefined\") {\n\t\t\t// if pixels is undefined, or if it's Uint8Array/Float32Array TypedArray\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tpixels,\n\t\t\t\t0,\n\t\t\t);\n\t\t} else if (\n\t\t\ttypeof globalThis.OffscreenCanvas !== \"undefined\" &&\n\t\t\tpixels instanceof globalThis.OffscreenCanvas\n\t\t) {\n\t\t\t// convert to ImageBitmap first (else Safari 16.4 and higher will throw an TypeError exception)\n\t\t\tconst imageBitmap = pixels.transferToImageBitmap();\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\timageBitmap,\n\t\t\t);\n\t\t\timageBitmap.close();\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tpixels,\n\t\t\t);\n\t\t}\n\n\t\t// generate the sprite mimap (used when scaling) if a PowerOfTwo texture\n\t\tif (isPOT && mipmap === true) {\n\t\t\tgl.generateMipmap(gl.TEXTURE_2D);\n\t\t}\n\n\t\treturn currentTexture;\n\t}\n\n\t/**\n\t * delete the given WebGL texture\n\t * @param {WebGLTexture} [texture] - a WebGL texture to delete\n\t */\n\tdeleteTexture2D(texture) {\n\t\tthis.gl.deleteTexture(texture);\n\t\tthis.unbindTexture2D(texture);\n\t}\n\n\t/**\n\t * returns the WebGL texture associated to the given texture unit\n\t * @param {number} unit - Texture unit to which a texture is bound\n\t * @returns {WebGLTexture} texture a WebGL texture\n\t */\n\tgetTexture2D(unit) {\n\t\treturn this.boundTextures[unit];\n\t}\n\n\t/**\n\t * assign the given WebGL texture to the current batch\n\t * @param {WebGLTexture} texture - a WebGL texture\n\t * @param {number} unit - Texture unit to which the given texture is bound\n\t */\n\tbindTexture2D(texture, unit) {\n\t\tconst gl = this.gl;\n\n\t\tif (texture !== this.boundTextures[unit]) {\n\t\t\tthis.flush();\n\t\t\tif (this.currentTextureUnit !== unit) {\n\t\t\t\tthis.currentTextureUnit = unit;\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + unit);\n\t\t\t}\n\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\t\tthis.boundTextures[unit] = texture;\n\t\t} else if (this.currentTextureUnit !== unit) {\n\t\t\tthis.flush();\n\t\t\tthis.currentTextureUnit = unit;\n\t\t\tgl.activeTexture(gl.TEXTURE0 + unit);\n\t\t}\n\t}\n\n\t/**\n\t * unbind the given WebGL texture, forcing it to be reuploaded\n\t * @param {WebGLTexture} [texture] - a WebGL texture\n\t * @param {number} [unit] - a WebGL texture\n\t * @returns {number} unit the unit number that was associated with the given texture\n\t */\n\tunbindTexture2D(texture, unit) {\n\t\tif (typeof unit === \"undefined\") {\n\t\t\tunit = this.boundTextures.indexOf(texture);\n\t\t}\n\t\tif (unit !== -1) {\n\t\t\tdelete this.boundTextures[unit];\n\t\t\tif (unit === this.currentTextureUnit) {\n\t\t\t\tthis.currentTextureUnit = -1;\n\t\t\t}\n\t\t}\n\t\treturn unit;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tuploadTexture(texture, w, h, force = false) {\n\t\tconst unit = this.renderer.cache.getUnit(texture);\n\t\tconst texture2D = this.boundTextures[unit];\n\n\t\tif (typeof texture2D === \"undefined\" || force) {\n\t\t\tthis.createTexture2D(\n\t\t\t\tunit,\n\t\t\t\ttexture.getTexture(),\n\t\t\t\tthis.renderer.settings.antiAlias ? this.gl.LINEAR : this.gl.NEAREST,\n\t\t\t\ttexture.repeat,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t\ttexture.premultipliedAlpha,\n\t\t\t\tundefined,\n\t\t\t\ttexture2D,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.bindTexture2D(texture2D, unit);\n\t\t}\n\n\t\treturn this.currentTextureUnit;\n\t}\n\n\t/**\n\t * Add a textured quad\n\t * @param {TextureAtlas} texture - Source texture atlas\n\t * @param {number} x - Destination x-coordinate\n\t * @param {number} y - Destination y-coordinate\n\t * @param {number} w - Destination width\n\t * @param {number} h - Destination height\n\t * @param {number} u0 - Texture UV (u0) value.\n\t * @param {number} v0 - Texture UV (v0) value.\n\t * @param {number} u1 - Texture UV (u1) value.\n\t * @param {number} v1 - Texture UV (v1) value.\n\t * @param {number} tint - tint color to be applied to the texture in UINT32 (argb) format\n\t * @param {boolean} reupload - Force the texture to be reuploaded even if already bound\n\t */\n\taddQuad(texture, x, y, w, h, u0, v0, u1, v1, tint, reupload = false) {\n\t\tconst vertexData = this.vertexData;\n\n\t\tif (vertexData.isFull(6)) {\n\t\t\t// is the vertex buffer full if we add 6 more vertices\n\t\t\tthis.flush();\n\t\t}\n\n\t\t// upload and activate the texture if necessary\n\t\tconst unit = this.uploadTexture(texture, w, h, reupload);\n\n\t\t// set fragment sampler accordingly\n\t\tthis.currentShader.setUniform(\"uSampler\", unit);\n\n\t\t// Transform vertices\n\t\tconst m = this.viewMatrix;\n\t\tconst vec0 = V_ARRAY[0].set(x, y);\n\t\tconst vec1 = V_ARRAY[1].set(x + w, y);\n\t\tconst vec2 = V_ARRAY[2].set(x, y + h);\n\t\tconst vec3 = V_ARRAY[3].set(x + w, y + h);\n\n\t\tif (!m.isIdentity()) {\n\t\t\tm.apply(vec0);\n\t\t\tm.apply(vec1);\n\t\t\tm.apply(vec2);\n\t\t\tm.apply(vec3);\n\t\t}\n\n\t\tvertexData.push(vec0.x, vec0.y, u0, v0, tint);\n\t\tvertexData.push(vec1.x, vec1.y, u1, v0, tint);\n\t\tvertexData.push(vec2.x, vec2.y, u0, v1, tint);\n\t\tvertexData.push(vec2.x, vec2.y, u0, v1, tint);\n\t\tvertexData.push(vec1.x, vec1.y, u1, v0, tint);\n\t\tvertexData.push(vec3.x, vec3.y, u1, v1, tint);\n\t}\n}\n", "import { Color, colorPool } from \"./../../math/color.ts\";\nimport { isPowerOfTwo } from \"./../../math/math.ts\";\nimport { Matrix2d, matrix2dPool } from \"../../math/matrix2d.ts\";\nimport {\n\tCANVAS_ONRESIZE,\n\teventEmitter,\n\tGAME_RESET,\n\tONCONTEXT_LOST,\n\tONCONTEXT_RESTORED,\n} from \"../../system/event.ts\";\nimport Renderer from \"./../renderer.js\";\nimport { createAtlas, TextureAtlas } from \"./../texture/atlas.js\";\nimport TextureCache from \"./../texture/cache.js\";\nimport { renderer } from \"./../video.js\";\nimport PrimitiveCompositor from \"./compositors/primitive_compositor\";\nimport QuadCompositor from \"./compositors/quad_compositor\";\n\n/**\n * additional import for TypeScript\n * @import {Rect} from \"./../../geometries/rectangle.ts\";\n * @import {RoundRect} from \"./../../geometries/roundrect.ts\";\n * @import {Polygon} from \"../../geometries/polygon.ts\";\n * @import {Line} from \"./../../geometries/line.ts\";\n * @import {Ellipse} from \"./../../geometries/ellipse.ts\";\n * @import {Matrix3d} from \"../../math/matrix3d.ts\";\n * @import Compositor from \"./compositors/compositor.js\";\n */\n\n// list of supported compressed texture formats\nlet supportedCompressedTextureFormats;\n\n/**\n * a WebGL renderer object\n */\nexport default class WebGLRenderer extends Renderer {\n\t/**\n\t * @param {ApplicationSettings} [options] - optional parameters for the renderer\n\t */\n\tconstructor(options) {\n\t\t// parent contructor\n\t\tsuper(Object.assign(options, { context: \"webgl\" }));\n\n\t\t/**\n\t\t * The vendor string of the underlying graphics driver.\n\t\t * @type {string}\n\t\t * @default undefined\n\t\t * @readonly\n\t\t */\n\t\tthis.GPUVendor = undefined;\n\n\t\t/**\n\t\t * The renderer string of the underlying graphics driver.\n\t\t * @type {string}\n\t\t * @default undefined\n\t\t * @readonly\n\t\t */\n\t\tthis.GPURenderer = undefined;\n\n\t\t/**\n\t\t * The WebGL context\n\t\t * @name gl\n\t\t * @type {WebGLRenderingContext}\n\t\t */\n\t\tthis.gl = this.renderTarget.context;\n\n\t\t/**\n\t\t * sets or returns the thickness of lines for shape drawing (limited to strokeLine, strokePolygon and strokeRect)\n\t\t * @type {number}\n\t\t * @default 1\n\t\t * @see WebGLRenderer#strokeLine\n\t\t * @see WebGLRenderer#strokePolygon\n\t\t * @see WebGLRenderer#strokeRect\n\t\t */\n\t\tthis.lineWidth = 1;\n\n\t\t/**\n\t\t * sets or returns the shape used to join two line segments where they meet.\n\t\t * Out of the three possible values for this property: \"round\", \"bevel\", and \"miter\", only \"round\" is supported for now in WebGL\n\t\t * @type {string}\n\t\t * @default \"round\"\n\t\t */\n\t\tthis.lineJoin = \"round\";\n\n\t\t/**\n\t\t * the vertex buffer used by this WebGL Renderer\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.vertexBuffer = this.gl.createBuffer();\n\n\t\t/**\n\t\t * Maximum number of texture unit supported under the current context\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.maxTextures = this.gl.getParameter(this.gl.MAX_TEXTURE_IMAGE_UNITS);\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis._colorStack = [];\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis._matrixStack = [];\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis._scissorStack = [];\n\n\t\t/**\n\t\t * @ignore\n\t\t */\n\t\tthis._blendStack = [];\n\n\t\t/**\n\t\t * The current transformation matrix used for transformations on the overall scene\n\t\t * @type {Matrix2d}\n\t\t */\n\t\tthis.currentTransform = new Matrix2d();\n\n\t\t/**\n\t\t * The current compositor used by the renderer\n\t\t * @type {Compositor}\n\t\t */\n\t\tthis.currentCompositor = undefined;\n\n\t\t/**\n\t\t * a reference to the current shader program used by the renderer\n\t\t * @type {WebGLProgram}\n\t\t */\n\t\tthis.currentProgram = undefined;\n\n\t\t/**\n\t\t * The list of active compositors\n\t\t * @type {Map<Compositor>}\n\t\t */\n\t\tthis.compositors = new Map();\n\n\t\t// bind the vertex buffer\n\t\tthis.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);\n\n\t\t// Create both quad and primitive compositor\n\t\tthis.addCompositor(\n\t\t\tnew (this.settings.compositor || QuadCompositor)(this),\n\t\t\t\"quad\",\n\t\t\ttrue,\n\t\t);\n\t\tthis.addCompositor(\n\t\t\tnew (this.settings.compositor || PrimitiveCompositor)(this),\n\t\t\t\"primitive\",\n\t\t);\n\n\t\t// depth Test settings\n\t\tthis.depthTest = options.depthTest;\n\n\t\t// default WebGL state(s)\n\t\tif (this.depthTest === \"z-buffer\") {\n\t\t\tthis.gl.enable(this.gl.DEPTH_TEST);\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc\n\t\t\tthis.gl.depthFunc(this.gl.LEQUAL);\n\t\t\tthis.gl.depthMask(true);\n\t\t} else {\n\t\t\tthis.gl.disable(this.gl.DEPTH_TEST);\n\t\t\tthis.gl.depthMask(false);\n\t\t}\n\n\t\tthis.gl.disable(this.gl.SCISSOR_TEST);\n\t\tthis.gl.enable(this.gl.BLEND);\n\n\t\t// set default mode\n\t\tthis.setBlendMode(this.settings.blendMode);\n\n\t\t// get GPU vendor and renderer\n\t\tconst debugInfo = this.gl.getExtension(\"WEBGL_debug_renderer_info\");\n\t\tif (debugInfo !== null) {\n\t\t\tthis.GPUVendor = this.gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n\t\t\tthis.GPURenderer = this.gl.getParameter(\n\t\t\t\tdebugInfo.UNMASKED_RENDERER_WEBGL,\n\t\t\t);\n\t\t}\n\n\t\t// a private property that when set will make `setCompositor`\n\t\t// to use this specific shader instead of the default one\n\t\tthis.customShader = undefined;\n\n\t\t// Create a texture cache\n\t\tthis.cache = new TextureCache(this.maxTextures);\n\n\t\t// set the renderer type\n\t\tthis.type = \"WebGL\" + this.WebGLVersion;\n\n\t\t// to simulate context lost and restore in WebGL:\n\t\t// let ctx = me.video.renderer.context.getExtension('WEBGL_lose_context');\n\t\t// ctx.loseContext()\n\t\tthis.getCanvas().addEventListener(\n\t\t\t\"webglcontextlost\",\n\t\t\t(e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.isContextValid = false;\n\t\t\t\teventEmitter.emit(ONCONTEXT_LOST, this);\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t\t// ctx.restoreContext()\n\t\tthis.getCanvas().addEventListener(\n\t\t\t\"webglcontextrestored\",\n\t\t\t() => {\n\t\t\t\tthis.reset();\n\t\t\t\tthis.isContextValid = true;\n\t\t\t\teventEmitter.emit(ONCONTEXT_RESTORED, this);\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\t// reset the renderer on game reset\n\t\teventEmitter.addListener(GAME_RESET, () => {\n\t\t\tthis.reset();\n\t\t});\n\n\t\t// register to the CANVAS resize channel\n\t\teventEmitter.addListener(CANVAS_ONRESIZE, (width, height) => {\n\t\t\tthis.flush();\n\t\t\tthis.setViewport(0, 0, width, height);\n\t\t});\n\t}\n\n\t/**\n\t * The WebGL version used by this renderer (1 or 2)\n\t * @type {number}\n\t * @default 1\n\t */\n\tget WebGLVersion() {\n\t\treturn this.renderTarget.WebGLVersion;\n\t}\n\n\t/**\n\t * return the list of supported compressed texture formats\n\t * @return {Object}\n\t */\n\tgetSupportedCompressedTextureFormats() {\n\t\tif (typeof supportedCompressedTextureFormats === \"undefined\") {\n\t\t\tconst gl = this.gl;\n\t\t\tsupportedCompressedTextureFormats = {\n\t\t\t\tastc:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_astc\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_astc\"),\n\t\t\t\tbptc:\n\t\t\t\t\tgl.getExtension(\"EXT_texture_compression_bptc\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_EXT_texture_compression_bptc\"),\n\t\t\t\ts3tc:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_s3tc\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\"),\n\t\t\t\ts3tc_srgb:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc_srgb\"),\n\t\t\t\tpvrtc:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_pvrtc\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\n\t\t\t\tetc1:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_etc1\") ||\n\t\t\t\t\tthis._gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc1\"),\n\t\t\t\tetc2:\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_etc\") ||\n\t\t\t\t\tgl.getExtension(\"WEBKIT_WEBGL_compressed_texture_etc\") ||\n\t\t\t\t\tgl.getExtension(\"WEBGL_compressed_texture_es3_0\"),\n\t\t\t};\n\t\t}\n\t\treturn supportedCompressedTextureFormats;\n\t}\n\n\t/**\n\t * return true if the given compressed texture format is supported\n\t * @param {Number} format\n\t * @returns\n\t */\n\thasSupportedCompressedFormats(format) {\n\t\tconst supportedFormats = this.getSupportedCompressedTextureFormats();\n\t\tfor (const supportedFormat in supportedFormats) {\n\t\t\tfor (const extension in supportedFormats[supportedFormat]) {\n\t\t\t\tif (format === supportedFormats[supportedFormat][extension]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Reset context state\n\t */\n\treset() {\n\t\tsuper.reset();\n\n\t\t// clear all stacks\n\t\tthis._colorStack.forEach((color) => {\n\t\t\tcolorPool.release(color);\n\t\t});\n\t\tthis._matrixStack.forEach((matrix) => {\n\t\t\tmatrix2dPool.release(matrix);\n\t\t});\n\t\tthis._colorStack.length = 0;\n\t\tthis._matrixStack.length = 0;\n\t\tthis._blendStack.length = 0;\n\n\t\t// clear gl context\n\t\tthis.clear();\n\n\t\t// initial viewport size\n\t\tthis.setViewport();\n\n\t\t// rebind the vertex buffer if required (e.g in case of context loss)\n\t\tif (\n\t\t\tthis.gl.getParameter(this.gl.ARRAY_BUFFER_BINDING) !== this.vertexBuffer\n\t\t) {\n\t\t\tthis.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);\n\t\t}\n\n\t\tthis.currentCompositor = undefined;\n\t\tthis.currentProgram = undefined;\n\t\tthis.customShader = undefined;\n\n\t\tthis.compositors.forEach((compositor) => {\n\t\t\tif (this.isContextValid === false) {\n\t\t\t\t// on context lost/restore\n\t\t\t\tcompositor.init(this);\n\t\t\t} else {\n\t\t\t\tcompositor.reset();\n\t\t\t}\n\t\t});\n\n\t\tthis.setCompositor(\"quad\");\n\n\t\tthis.gl.disable(this.gl.SCISSOR_TEST);\n\t}\n\n\t/**\n\t * add a new compositor to this renderer\n\t * @param {Compositor} compositor - a compositor instance\n\t * @param {string} name - a name uniquely identifying this compositor\n\t * @param {boolean} [activate=false] - true if the given compositor should be set as the active one\n\t */\n\taddCompositor(compositor, name = \"default\", activate = false) {\n\t\t// make sure there is no existing compositor with the same name\n\t\tif (typeof this.compositors.get(name) !== \"undefined\") {\n\t\t\tthrow new Error(\"Invalid Compositor name\");\n\t\t}\n\n\t\t// add the new compositor\n\t\tthis.compositors.set(name, compositor);\n\n\t\tif (activate === true) {\n\t\t\t// set as active one\n\t\t\tthis.setCompositor(name);\n\t\t}\n\t}\n\n\t/**\n\t * set the active compositor for this renderer\n\t * @param {string} name - a compositor name\n\t * @param {GLShader} [shader] - an optional shader program to be used, instead of the default one, when activating the compositor\n\t * @returns {Compositor} an instance to the current active compositor\n\t */\n\tsetCompositor(name = \"default\", shader = this.customShader) {\n\t\tconst compositor = this.compositors.get(name);\n\n\t\tif (typeof compositor === \"undefined\") {\n\t\t\tthrow new Error(\"Invalid Compositor\");\n\t\t}\n\n\t\tif (this.currentCompositor !== compositor) {\n\t\t\tif (this.currentCompositor !== undefined) {\n\t\t\t\t// flush the current compositor\n\t\t\t\tthis.currentCompositor.flush();\n\t\t\t}\n\t\t\t// set as the active one\n\t\t\tthis.currentCompositor = compositor;\n\t\t}\n\n\t\tif (name === \"quad\" && typeof shader === \"object\") {\n\t\t\tthis.currentCompositor.useShader(shader);\n\t\t} else {\n\t\t\t// (re)bind the compositor with the default shader (program & attributes)\n\t\t\tthis.currentCompositor.bind();\n\t\t}\n\n\t\treturn this.currentCompositor;\n\t}\n\n\t/**\n\t * Reset the gl transform to identity\n\t */\n\tresetTransform() {\n\t\tthis.currentTransform.identity();\n\t}\n\n\t/**\n\t * Create a pattern with the specified repetition\n\t * @param {HTMLImageElement|SVGImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap|OffscreenCanvas|VideoFrame} image - Source image to be used as the pattern's image\n\t * @param {string} repeat - Define how the pattern should be repeated\n\t * @returns {TextureAtlas} the patterned texture created\n\t * @see ImageLayer#repeat\n\t * @example\n\t * let tileable = renderer.createPattern(image, \"repeat\");\n\t * let horizontal = renderer.createPattern(image, \"repeat-x\");\n\t * let vertical = renderer.createPattern(image, \"repeat-y\");\n\t * let basic = renderer.createPattern(image, \"no-repeat\");\n\t */\n\tcreatePattern(image, repeat) {\n\t\tthis.setCompositor(\"quad\");\n\n\t\tif (\n\t\t\trenderer.WebGLVersion === 1 &&\n\t\t\t(!isPowerOfTwo(image.width) || !isPowerOfTwo(image.height))\n\t\t) {\n\t\t\tconst src = typeof image.src !== \"undefined\" ? image.src : image;\n\t\t\tthrow new Error(\n\t\t\t\t\"[WebGL Renderer] \" +\n\t\t\t\t\tsrc +\n\t\t\t\t\t\" is not a POT texture \" +\n\t\t\t\t\t\"(\" +\n\t\t\t\t\timage.width +\n\t\t\t\t\t\"x\" +\n\t\t\t\t\timage.height +\n\t\t\t\t\t\")\",\n\t\t\t);\n\t\t}\n\n\t\tconst texture = new TextureAtlas(\n\t\t\tcreateAtlas(image.width, image.height, \"pattern\", repeat),\n\t\t\timage,\n\t\t);\n\n\t\t// FIXME: Remove old cache entry and texture when changing the repeat mode\n\t\tthis.currentCompositor.uploadTexture(texture);\n\n\t\treturn texture;\n\t}\n\n\t/**\n\t * Flush the compositor to the frame buffer\n\t */\n\tflush() {\n\t\tthis.currentCompositor.flush();\n\t}\n\n\t/**\n\t * set/change the current projection matrix (WebGL only)\n\t * @param {Matrix3d} matrix - the new projection matrix\n\t */\n\tsetProjection(matrix) {\n\t\tsuper.setProjection(matrix);\n\t\tthis.currentCompositor.setProjection(matrix);\n\t}\n\n\t/**\n\t * Sets the WebGL viewport, which specifies the affine transformation of x and y from normalized device coordinates to window coordinates\n\t * @param {number} [x = 0] - x the horizontal coordinate for the lower left corner of the viewport origin\n\t * @param {number} [y = 0] - y the vertical coordinate for the lower left corner of the viewport origin\n\t * @param {number} [w = width of the canvas] - the width of viewport\n\t * @param {number} [h = height of the canvas] - the height of viewport\n\t */\n\tsetViewport(\n\t\tx = 0,\n\t\ty = 0,\n\t\tw = this.getCanvas().width,\n\t\th = this.getCanvas().height,\n\t) {\n\t\tthis.gl.viewport(x, y, w, h);\n\t}\n\n\t/**\n\t * Clear the frame buffer\n\t */\n\tclear() {\n\t\tconst gl = this.gl;\n\t\tconst clearColor = this.backgroundColor.toArray();\n\t\tgl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);\n\t\tthis.lineWidth = 1;\n\t\tif (this.depthTest === \"z-buffer\") {\n\t\t\tgl.clear(\n\t\t\t\tgl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\t\t}\n\t}\n\n\t/**\n\t * Clears the gl context with the given color.\n\t * @param {Color|string} [color=\"#000000\"] - CSS color.\n\t * @param {boolean} [opaque=false] - Allow transparency [default] or clear the surface completely [true]\n\t */\n\tclearColor(color = \"#000000\", opaque = false) {\n\t\tlet glArray;\n\t\tconst gl = this.gl;\n\n\t\tif (color instanceof Color) {\n\t\t\tglArray = color.toArray();\n\t\t} else {\n\t\t\tconst _color = colorPool.get();\n\t\t\t// reuse temporary the renderer default color object\n\t\t\tglArray = _color.parseCSS(color).toArray();\n\t\t\tcolorPool.release(_color);\n\t\t}\n\n\t\t// clear gl context with the specified color\n\t\tgl.clearColor(\n\t\t\tglArray[0],\n\t\t\tglArray[1],\n\t\t\tglArray[2],\n\t\t\topaque === true ? 1.0 : glArray[3],\n\t\t);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t}\n\n\t/**\n\t * Erase the pixels in the given rectangular area by setting them to transparent black (rgba(0,0,0,0)).\n\t * @param {number} x - x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t */\n\tclearRect(x, y, width, height) {\n\t\tthis.save();\n\t\tthis.clipRect(x, y, width, height);\n\t\tthis.clearColor();\n\t\tthis.restore();\n\t}\n\n\t/**\n\t * Draw an image to the gl context\n\t * @param {HTMLImageElement|SVGImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap|OffscreenCanvas|VideoFrame} image - An element to draw into the context.\n\t * @param {number} sx - The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} sy - The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} sw - The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by sx and sy to the bottom-right corner of the image is used.\n\t * @param {number} sh - The height of the sub-rectangle of the source image to draw into the destination context.\n\t * @param {number} dx - The X coordinate in the destination canvas at which to place the top-left corner of the source image.\n\t * @param {number} dy - The Y coordinate in the destination canvas at which to place the top-left corner of the source image.\n\t * @param {number} dw - The width to draw the image in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.\n\t * @param {number} dh - The height to draw the image in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.\n\t * @example\n\t * // Position the image on the canvas:\n\t * renderer.drawImage(image, dx, dy);\n\t * // Position the image on the canvas, and specify width and height of the image:\n\t * renderer.drawImage(image, dx, dy, dWidth, dHeight);\n\t * // Clip the image and position the clipped part on the canvas:\n\t * renderer.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n\t */\n\tdrawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t\tif (typeof sw === \"undefined\") {\n\t\t\tsw = dw = image.width;\n\t\t\tsh = dh = image.height;\n\t\t\tdx = sx;\n\t\t\tdy = sy;\n\t\t\tsx = 0;\n\t\t\tsy = 0;\n\t\t} else if (typeof dx === \"undefined\") {\n\t\t\tdx = sx;\n\t\t\tdy = sy;\n\t\t\tdw = sw;\n\t\t\tdh = sh;\n\t\t\tsw = image.width;\n\t\t\tsh = image.height;\n\t\t\tsx = 0;\n\t\t\tsy = 0;\n\t\t}\n\n\t\tif (this.settings.subPixel === false) {\n\t\t\t// clamp to pixel grid\n\t\t\tdx |= 0;\n\t\t\tdy |= 0;\n\t\t}\n\n\t\tthis.setCompositor(\"quad\");\n\t\t// force reuploading if the given image is a HTMLVideoElement\n\t\tconst reupload = typeof image.videoWidth !== \"undefined\";\n\t\tconst texture = this.cache.get(image);\n\t\tconst uvs = texture.getUVs(sx + \",\" + sy + \",\" + sw + \",\" + sh);\n\t\tthis.currentCompositor.addQuad(\n\t\t\ttexture,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tdw,\n\t\t\tdh,\n\t\t\tuvs[0],\n\t\t\tuvs[1],\n\t\t\tuvs[2],\n\t\t\tuvs[3],\n\t\t\tthis.currentTint.toUint32(this.getGlobalAlpha()),\n\t\t\treupload,\n\t\t);\n\t}\n\n\t/**\n\t * Draw a pattern within the given rectangle.\n\t * @param {TextureAtlas} pattern - Pattern object\n\t * @param {number} x - x position where to draw the pattern\n\t * @param {number} y - y position where to draw the pattern\n\t * @param {number} width - width of the pattern\n\t * @param {number} height - height of the pattern\n\t * @see WebGLRenderer#createPattern\n\t */\n\tdrawPattern(pattern, x, y, width, height) {\n\t\tconst uvs = pattern.getUVs(\"0,0,\" + width + \",\" + height);\n\t\tthis.setCompositor(\"quad\");\n\t\tthis.currentCompositor.addQuad(\n\t\t\tpattern,\n\t\t\tx,\n\t\t\ty,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tuvs[0],\n\t\t\tuvs[1],\n\t\t\tuvs[2],\n\t\t\tuvs[3],\n\t\t\tthis.currentTint.toUint32(this.getGlobalAlpha()),\n\t\t);\n\t}\n\n\t/**\n\t * starts a new path by emptying the list of sub-paths. Call this method when you want to create a new path\n\t * @example\n\t * // First path\n\t * renderer.beginPath();\n\t * renderer.setColor(\"blue\");\n\t * renderer.moveTo(20, 20);\n\t * renderer.lineTo(200, 20);\n\t * renderer.stroke();\n\t * // Second path\n\t * renderer.beginPath();\n\t * renderer.setColor(\"green\");\n\t * renderer.moveTo(20, 20);\n\t * renderer.lineTo(120, 120);\n\t * renderer.stroke();\n\t */\n\tbeginPath() {\n\t\tthis.path2D.beginPath();\n\t}\n\n\t/**\n\t * begins a new sub-path at the point specified by the given (x, y) coordinates.\n\t * @param {number} x - The x axis of the point.\n\t * @param {number} y - The y axis of the point.\n\t */\n\tmoveTo(x, y) {\n\t\tthis.path2D.moveTo(x, y);\n\t}\n\n\t/**\n\t * adds a straight line to the current sub-path by connecting the sub-path's last point to the specified (x, y) coordinates.\n\t */\n\tlineTo(x, y) {\n\t\tthis.path2D.lineTo(x, y);\n\t}\n\n\t/**\n\t * creates a rectangular path whose starting point is at (x, y) and whose size is specified by width and height.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t */\n\trect(x, y, width, height) {\n\t\tthis.path2D.rect(x, y, width, height);\n\t}\n\n\t/**\n\t * adds a rounded rectangle to the current path.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t * @param {number} radius - The corner radius.\n\t */\n\troundRect(x, y, width, height, radii) {\n\t\tthis.path2D.roundRect(x, y, width, height, radii);\n\t}\n\n\t/**\n\t * stroke the given shape or the current defined path\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} [shape] - a shape object to stroke\n\t * @param {boolean} [fill=false] - fill the shape with the current color if true\n\t */\n\tstroke(shape, fill) {\n\t\tthis.setCompositor(\"primitive\");\n\t\tif (typeof shape === \"undefined\") {\n\t\t\tif (fill === true) {\n\t\t\t\t// draw all triangles\n\t\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t\t}\n\t\t} else {\n\t\t\tsuper.stroke(shape, fill);\n\t\t}\n\t}\n\n\t/**\n\t * fill the given shape or the current defined path\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse|Bounds} [shape] - a shape object to fill\n\t */\n\tfill(shape) {\n\t\tthis.stroke(shape, true);\n\t}\n\n\t/**\n\t * add a straight line from the current point to the start of the current sub-path. If the shape has already been closed or has only one point, this function does nothing\n\t */\n\tclosePath() {\n\t\tthis.path2D.closePath();\n\t}\n\n\t/**\n\t * Returns the WebGLContext instance for the renderer\n\t * return a reference to the system 2d Context\n\t * @returns {WebGLRenderingContext} the current WebGL context\n\t */\n\tgetContext() {\n\t\treturn this.gl;\n\t}\n\n\t/**\n\t * set a blend mode for the given context. <br>\n\t * Supported blend mode between Canvas and WebGL remderer : <br>\n\t * - \"normal\" : this is the default mode and draws new content on top of the existing content <br>\n\t * <img src=\"../images/normal-blendmode.png\" width=\"510\"/> <br>\n\t * - \"multiply\" : the pixels of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result. <br>\n\t * <img src=\"../images/multiply-blendmode.png\" width=\"510\"/> <br>\n\t * - \"additive or lighter\" : where both content overlap the color is determined by adding color values. <br>\n\t * <img src=\"../images/lighter-blendmode.png\" width=\"510\"/> <br>\n\t * - \"screen\" : The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply) <br>\n\t * <img src=\"../images/screen-blendmode.png\" width=\"510\"/> <br>\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n\t * @param {string} [mode=\"normal\"] - blend mode : \"normal\", \"multiply\", \"lighter\", \"additive\", \"screen\"\n\t * @param {WebGLRenderingContext} [gl] - a WebGL context\n\t */\n\tsetBlendMode(mode = \"normal\", gl = this.gl) {\n\t\tif (this.currentBlendMode !== mode) {\n\t\t\tthis.flush();\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tthis.currentBlendMode = mode;\n\n\t\t\tswitch (mode) {\n\t\t\t\tcase \"screen\":\n\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"lighter\":\n\t\t\t\tcase \"additive\":\n\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"multiply\":\n\t\t\t\t\tgl.blendFunc(gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\tthis.currentBlendMode = \"normal\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * restores the most recently saved renderer state by popping the top entry in the drawing state stack\n\t * @example\n\t * // Save the current state\n\t * renderer.save();\n\t *\n\t * // apply a transform and draw a rect\n\t * renderer.tranform(matrix);\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Restore to the state saved by the most recent call to save()\n\t * renderer.restore();\n\t */\n\trestore() {\n\t\t// do nothing if there is no saved states\n\t\tif (this._matrixStack.length !== 0) {\n\t\t\tconst color = this._colorStack.pop();\n\t\t\tconst matrix = this._matrixStack.pop();\n\n\t\t\t// restore the previous context\n\t\t\tthis.currentColor.copy(color);\n\t\t\tthis.currentTransform.copy(matrix);\n\n\t\t\tthis.setBlendMode(this._blendStack.pop());\n\n\t\t\t// recycle objects\n\t\t\tcolorPool.release(color);\n\t\t\tmatrix2dPool.release(matrix);\n\t\t}\n\n\t\tif (this._scissorStack.length !== 0) {\n\t\t\t// FIXME : prevent `scissor` object realloc and GC\n\t\t\tthis.currentScissor.set(this._scissorStack.pop());\n\t\t} else {\n\t\t\tconst canvas = this.getCanvas();\n\t\t\t// turn off scissor test\n\t\t\tthis.gl.disable(this.gl.SCISSOR_TEST);\n\t\t\tthis.currentScissor[0] = 0;\n\t\t\tthis.currentScissor[1] = 0;\n\t\t\tthis.currentScissor[2] = canvas.width;\n\t\t\tthis.currentScissor[3] = canvas.height;\n\t\t}\n\t}\n\n\t/**\n\t * saves the entire state of the renderer by pushing the current state onto a stack.\n\t * @example\n\t * // Save the current state\n\t * renderer.save();\n\t *\n\t * // apply a transform and draw a rect\n\t * renderer.tranform(matrix);\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Restore to the state saved by the most recent call to save()\n\t * renderer.restore();\n\t */\n\tsave() {\n\t\tthis._colorStack.push(this.currentColor.clone());\n\t\tthis._matrixStack.push(this.currentTransform.clone());\n\n\t\tif (this.gl.isEnabled(this.gl.SCISSOR_TEST)) {\n\t\t\t// FIXME avoid slice and object realloc\n\t\t\tthis._scissorStack.push(this.currentScissor.slice());\n\t\t}\n\n\t\tthis._blendStack.push(this.getBlendMode());\n\t}\n\n\t/**\n\t * adds a rotation to the transformation matrix.\n\t * @param {number} angle - the rotation angle, clockwise in radians\n\t * @example\n\t * // Rotated rectangle\n\t * renderer.rotate((45 * Math.PI) / 180);\n\t * renderer.setColor(\"red\");\n\t * renderer.fillRect(10, 10, 100, 100);\n\t *\n\t * // Reset transformation matrix to the identity matrix\n\t * renderer.setTransform(1, 0, 0, 1, 0, 0);\n\t */\n\trotate(angle) {\n\t\tthis.currentTransform.rotate(angle);\n\t}\n\n\t/**\n\t * adds a scaling transformation to the renderer units horizontally and/or vertically\n\t * @param {number} x - Scaling factor in the horizontal direction. A negative value flips pixels across the vertical axis. A value of 1 results in no horizontal scaling.\n\t * @param {number} y - Scaling factor in the vertical direction. A negative value flips pixels across the horizontal axis. A value of 1 results in no vertical scaling\n\t */\n\tscale(x, y) {\n\t\tthis.currentTransform.scale(x, y);\n\t}\n\n\t/**\n\t * not used by this renderer?\n\t * @param {boolean} [enable=false]\n\t * @ignore\n\t */\n\tsetAntiAlias(enable = false) {\n\t\tsuper.setAntiAlias(enable);\n\t\t// TODO: perhaps handle GLNEAREST or other options with texture binding\n\t}\n\n\t/**\n\t * Set the global alpha\n\t * @param {number} alpha - 0.0 to 1.0 values accepted.\n\t */\n\tsetGlobalAlpha(alpha) {\n\t\tthis.currentColor.alpha = alpha;\n\t}\n\n\t/**\n\t * Return the global alpha\n\t * @returns {number} global alpha value\n\t */\n\tgetGlobalAlpha() {\n\t\treturn this.currentColor.alpha;\n\t}\n\n\t/**\n\t * Set the current fill & stroke style color.\n\t * By default, or upon reset, the value is set to #000000.\n\t * @param {Color|string} color - css color string.\n\t */\n\tsetColor(color) {\n\t\tconst alpha = this.currentColor.alpha;\n\t\tthis.currentColor.copy(color);\n\t\tthis.currentColor.alpha *= alpha;\n\t}\n\n\t/**\n\t * Stroke an arc at the specified coordinates with given radius, start and end points\n\t * @param {number} x - arc center point x-axis\n\t * @param {number} y - arc center point y-axis\n\t * @param {number} radius - arc radius\n\t * @param {number} start - start angle in radians\n\t * @param {number} end - end angle in radians\n\t * @param {boolean} [antiClockwise=false] - draw arc anti-clockwise\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeArc(x, y, radius, start, end, antiClockwise = false, fill = false) {\n\t\tthis.setCompositor(\"primitive\");\n\t\tthis.path2D.beginPath();\n\t\tthis.path2D.arc(x, y, radius, start, end, antiClockwise);\n\t\tif (fill === false) {\n\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t} else {\n\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Fill an arc at the specified coordinates with given radius, start and end points\n\t * @param {number} x - arc center point x-axis\n\t * @param {number} y - arc center point y-axis\n\t * @param {number} radius - arc radius\n\t * @param {number} start - start angle in radians\n\t * @param {number} end - end angle in radians\n\t * @param {boolean} [antiClockwise=false] - draw arc anti-clockwise\n\t */\n\tfillArc(x, y, radius, start, end, antiClockwise = false) {\n\t\tthis.strokeArc(x, y, radius, start, end, antiClockwise, true);\n\t}\n\n\t/**\n\t * Stroke an ellipse at the specified coordinates with given radius\n\t * @param {number} x - ellipse center point x-axis\n\t * @param {number} y - ellipse center point y-axis\n\t * @param {number} w - horizontal radius of the ellipse\n\t * @param {number} h - vertical radius of the ellipse\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeEllipse(x, y, w, h, fill = false) {\n\t\tthis.setCompositor(\"primitive\");\n\t\tthis.path2D.beginPath();\n\t\tthis.path2D.ellipse(x, y, w, h, 0, 0, 360);\n\t\tif (fill === false) {\n\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t} else {\n\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Fill an ellipse at the specified coordinates with given radius\n\t * @param {number} x - ellipse center point x-axis\n\t * @param {number} y - ellipse center point y-axis\n\t * @param {number} w - horizontal radius of the ellipse\n\t * @param {number} h - vertical radius of the ellipse\n\t */\n\tfillEllipse(x, y, w, h) {\n\t\tthis.strokeEllipse(x, y, w, h, true);\n\t}\n\n\t/**\n\t * Stroke a line of the given two points\n\t * @param {number} startX - the start x coordinate\n\t * @param {number} startY - the start y coordinate\n\t * @param {number} endX - the end x coordinate\n\t * @param {number} endY - the end y coordinate\n\t */\n\tstrokeLine(startX, startY, endX, endY) {\n\t\tthis.setCompositor(\"primitive\");\n\t\tif (this.lineWidth === 1) {\n\t\t\tthis.path2D.beginPath();\n\t\t\tthis.path2D.moveTo(startX, startY);\n\t\t\tthis.path2D.lineTo(endX, endY);\n\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t} else if (this.lineWidth > 1) {\n\t\t\tconst halfWidth = this.lineWidth / 2;\n\t\t\tconst angle = Math.atan2(endY - startY, endX - startX);\n\t\t\tconst dx = Math.sin(angle) * halfWidth;\n\t\t\tconst dy = Math.cos(angle) * halfWidth;\n\t\t\tconst x1 = startX - dx;\n\t\t\tconst y1 = startY + dy;\n\t\t\tconst x2 = startX + dx;\n\t\t\tconst y2 = startY - dy;\n\t\t\tconst x3 = endX + dx;\n\t\t\tconst y3 = endY - dy;\n\t\t\tconst x4 = endX - dx;\n\t\t\tconst y4 = endY + dy;\n\n\t\t\tthis.path2D.beginPath();\n\t\t\tthis.path2D.moveTo(x1, y1);\n\t\t\tthis.path2D.lineTo(x2, y2);\n\t\t\tthis.path2D.lineTo(x3, y3);\n\t\t\tthis.path2D.lineTo(x4, y4);\n\t\t\tthis.path2D.closePath();\n\t\t\t// draw all triangles\n\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Fill a line of the given two points\n\t * @param {number} startX - the start x coordinate\n\t * @param {number} startY - the start y coordinate\n\t * @param {number} endX - the end x coordinate\n\t * @param {number} endY - the end y coordinate\n\t */\n\tfillLine(startX, startY, endX, endY) {\n\t\tthis.strokeLine(startX, startY, endX, endY);\n\t}\n\n\t/**\n\t * Stroke a Polygon on the screen with a specified color\n\t * @param {Polygon} poly - the shape to draw\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokePolygon(poly, fill = false) {\n\t\tconst points = poly.points;\n\t\tconst len = points.length;\n\n\t\tthis.translate(poly.pos.x, poly.pos.y);\n\n\t\tif (fill === false && this.lineWidth > 1) {\n\t\t\tconst radius = this.lineWidth / 2;\n\t\t\tfor (let i = 0; i < len - 1; i++) {\n\t\t\t\tconst curPoint = points[i];\n\t\t\t\tconst nextPoint = points[i + 1];\n\t\t\t\tthis.fillEllipse(nextPoint.x, nextPoint.y, radius, radius);\n\t\t\t\tthis.strokeLine(curPoint.x, curPoint.y, nextPoint.x, nextPoint.y);\n\t\t\t}\n\t\t\tconst lastPoint = points[len - 1];\n\t\t\tconst firstPoint = points[0];\n\t\t\tif (!lastPoint.equals(firstPoint)) {\n\t\t\t\tthis.fillEllipse(firstPoint.x, firstPoint.y, radius, radius);\n\t\t\t\tthis.strokeLine(lastPoint.x, lastPoint.y, firstPoint.x, firstPoint.y);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.setCompositor(\"primitive\");\n\t\t\tthis.path2D.beginPath();\n\t\t\tfor (let i = 0; i < len - 1; i++) {\n\t\t\t\tconst curPoint = points[i];\n\t\t\t\tconst nextPoint = points[i + 1];\n\t\t\t\tthis.path2D.moveTo(curPoint.x, curPoint.y);\n\t\t\t\tthis.path2D.lineTo(nextPoint.x, nextPoint.y);\n\t\t\t}\n\t\t\tthis.path2D.closePath();\n\t\t\tif (fill === false) {\n\t\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t\t} else {\n\t\t\t\t// draw all triangles\n\t\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.translate(-poly.pos.x, -poly.pos.y);\n\t}\n\n\t/**\n\t * Fill a me.Polygon on the screen\n\t * @param {Polygon} poly - the shape to draw\n\t */\n\tfillPolygon(poly) {\n\t\tthis.strokePolygon(poly, true);\n\t}\n\n\t/**\n\t * Draw a stroke rectangle at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeRect(x, y, width, height, fill = false) {\n\t\tif (fill === false && this.lineWidth > 1) {\n\t\t\tconst radius = this.lineWidth / 2;\n\t\t\tthis.strokeLine(x, y, x + width, y);\n\t\t\tthis.strokeLine(x + width, y, x + width, y + height);\n\t\t\tthis.strokeLine(x + width, y + height, x, y + height);\n\t\t\tthis.strokeLine(x, y + height, x, y);\n\t\t\tthis.fillEllipse(x, y, radius, radius);\n\t\t\tthis.fillEllipse(x + width, y, radius, radius);\n\t\t\tthis.fillEllipse(x + width, y + height, radius, radius);\n\t\t\tthis.fillEllipse(x, y + height, radius, radius);\n\t\t} else {\n\t\t\tthis.setCompositor(\"primitive\");\n\t\t\tthis.path2D.beginPath();\n\t\t\tthis.path2D.rect(x, y, width, height);\n\t\t\tif (fill === false) {\n\t\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t\t} else {\n\t\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Draw a filled rectangle at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t */\n\tfillRect(x, y, width, height) {\n\t\tthis.strokeRect(x, y, width, height, true);\n\t}\n\n\t/**\n\t * Stroke a rounded rectangle at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the rounded rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rounded rectangle starting point.\n\t * @param {number} width - The rounded rectangle's width.\n\t * @param {number} height - The rounded rectangle's height.\n\t * @param {number} radius - The rounded corner's radius.\n\t * @param {boolean} [fill=false] - also fill the shape with the current color if true\n\t */\n\tstrokeRoundRect(x, y, width, height, radius, fill = false) {\n\t\tthis.setCompositor(\"primitive\");\n\t\tthis.path2D.beginPath();\n\t\tthis.path2D.roundRect(x, y, width, height, radius);\n\t\tif (fill === false) {\n\t\t\tthis.currentCompositor.drawVertices(this.gl.LINES, this.path2D.points);\n\t\t} else {\n\t\t\tthis.currentCompositor.drawVertices(\n\t\t\t\tthis.gl.TRIANGLES,\n\t\t\t\tthis.path2D.triangulatePath(),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Draw a rounded filled rectangle at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the rounded rectangle starting point.\n\t * @param {number} y - y axis of the coordinate for the rounded rectangle starting point.\n\t * @param {number} width - The rounded rectangle's width.\n\t * @param {number} height - The rounded rectangle's height.\n\t * @param {number} radius - The rounded corner's radius.\n\t */\n\tfillRoundRect(x, y, width, height, radius) {\n\t\tthis.strokeRoundRect(x, y, width, height, radius, true);\n\t}\n\n\t/**\n\t * Stroke a Point at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the point.\n\t * @param {number} y - y axis of the coordinate for the point.\n\t */\n\tstrokePoint(x, y) {\n\t\tthis.strokeLine(x, y, x + 1, y + 1);\n\t}\n\n\t/**\n\t * Draw a a point at the specified coordinates\n\t * @param {number} x - x axis of the coordinate for the point.\n\t * @param {number} y - y axis of the coordinate for the point.\n\t */\n\tfillPoint(x, y) {\n\t\tthis.strokePoint(x, y);\n\t}\n\n\t/**\n\t * Reset (overrides) the renderer transformation matrix to the\n\t * identity one, and then apply the given transformation matrix.\n\t * @param {Matrix2d|number} a - a matrix2d to transform by, or a the a component to multiply the current matrix by\n\t * @param {number} b - the b component to multiply the current matrix by\n\t * @param {number} c - the c component to multiply the current matrix by\n\t * @param {number} d - the d component to multiply the current matrix by\n\t * @param {number} e - the e component to multiply the current matrix by\n\t * @param {number} f - the f component to multiply the current matrix by\n\t */\n\tsetTransform(a, b, c, d, e, f) {\n\t\tthis.resetTransform();\n\t\tthis.transform(a, b, c, d, e, f);\n\t}\n\n\t/**\n\t * Multiply given matrix into the renderer tranformation matrix\n\t * @see {@link WebGLRenderer.setTransform} which will reset the current transform matrix prior to performing the new transformation\n\t * @param {Matrix2d|number} a - a matrix2d to transform by, or a the a component to multiply the current matrix by\n\t * @param {number} b - the b component to multiply the current matrix by\n\t * @param {number} c - the c component to multiply the current matrix by\n\t * @param {number} d - the d component to multiply the current matrix by\n\t * @param {number} e - the e component to multiply the current matrix by\n\t * @param {number} f - the f component to multiply the current matrix by\n\t */\n\ttransform(a, b, c, d, e, f) {\n\t\tif (typeof a === \"object\") {\n\t\t\tthis.currentTransform.multiply(a);\n\t\t} else {\n\t\t\t// indivudual component\n\t\t\tthis.currentTransform.transform(a, b, c, d, e, f);\n\t\t}\n\t\tif (this.settings.subPixel === false) {\n\t\t\t// snap position values to pixel grid\n\t\t\tconst a = this.currentTransform.toArray();\n\t\t\ta[6] |= 0;\n\t\t\ta[7] |= 0;\n\t\t}\n\t}\n\n\t/**\n\t * adds a translation transformation to the current matrix.\n\t * @param {number} x - Distance to move in the horizontal direction. Positive values are to the right, and negative to the left.\n\t * @param {number} y - Distance to move in the vertical direction. Positive values are down, and negative are up.\n\t */\n\ttranslate(x, y) {\n\t\tconst currentTransform = this.currentTransform;\n\t\tcurrentTransform.translate(x, y);\n\t\tif (this.settings.subPixel === false) {\n\t\t\t// snap position values to pixel grid\n\t\t\tconst a = currentTransform.toArray();\n\t\t\ta[6] |= 0;\n\t\t\ta[7] |= 0;\n\t\t}\n\t}\n\n\t/**\n\t * clip the given region from the original canvas. Once a region is clipped,\n\t * all future drawing will be limited to the clipped region.\n\t * You can however save the current region using the save(),\n\t * and restore it (with the restore() method) any time in the future.\n\t * (<u>this is an experimental feature !</u>)\n\t * @param {number} x - x axis of the coordinate for the upper-left corner of the rectangle to start clipping from.\n\t * @param {number} y - y axis of the coordinate for the upper-left corner of the rectangle to start clipping from.\n\t * @param {number} width - the width of the rectangle to start clipping from.\n\t * @param {number} height - the height of the rectangle to start clipping from.\n\t */\n\tclipRect(x, y, width, height) {\n\t\tconst canvas = this.getCanvas();\n\t\tconst gl = this.gl;\n\t\t// if requested box is different from the current canvas size\n\t\tif (\n\t\t\tx !== 0 ||\n\t\t\ty !== 0 ||\n\t\t\twidth !== canvas.width ||\n\t\t\theight !== canvas.height\n\t\t) {\n\t\t\tconst currentScissor = this.currentScissor;\n\t\t\tif (gl.isEnabled(gl.SCISSOR_TEST)) {\n\t\t\t\t// if same as the current scissor box do nothing\n\t\t\t\tif (\n\t\t\t\t\tcurrentScissor[0] === x &&\n\t\t\t\t\tcurrentScissor[1] === y &&\n\t\t\t\t\tcurrentScissor[2] === width &&\n\t\t\t\t\tcurrentScissor[3] === height\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// flush the compositor\n\t\t\tthis.flush();\n\t\t\t// turn on scissor test\n\t\t\tgl.enable(this.gl.SCISSOR_TEST);\n\t\t\t// set the scissor rectangle (note : coordinates are left/bottom)\n\t\t\tgl.scissor(\n\t\t\t\t// scissor does not account for currentTransform, so manually adjust\n\t\t\t\tx + this.currentTransform.tx,\n\t\t\t\tcanvas.height - height - y - this.currentTransform.ty,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t);\n\t\t\t// save the new currentScissor box\n\t\t\tcurrentScissor[0] = x;\n\t\t\tcurrentScissor[1] = y;\n\t\t\tcurrentScissor[2] = width;\n\t\t\tcurrentScissor[3] = height;\n\t\t} else {\n\t\t\t// turn off scissor test\n\t\t\tgl.disable(gl.SCISSOR_TEST);\n\t\t}\n\t}\n\n\t/**\n\t * A mask limits rendering elements to the shape and position of the given mask object.\n\t * If the drawing or rendering area is larger than the mask, only the intersecting part of the renderable will be visible.\n\t * (Note Mask are not preserved through renderer context save and restore and need so be manually cleared)\n\t * @see CanvasRenderer#clearMask\n\t * @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] - a shape defining the mask to be applied\n\t * @param {boolean} [invert=false] - either the given shape should define what is visible (default) or the opposite\n\t */\n\tsetMask(mask, invert = false) {\n\t\tconst gl = this.gl;\n\n\t\t// flush the compositor\n\t\tthis.flush();\n\n\t\tif (this.maskLevel === 0) {\n\t\t\t// Enable and setup GL state to write to stencil buffer\n\t\t\tgl.enable(gl.STENCIL_TEST);\n\t\t\tgl.clear(gl.STENCIL_BUFFER_BIT);\n\t\t}\n\n\t\tthis.maskLevel++;\n\n\t\tgl.colorMask(false, false, false, false);\n\t\tgl.stencilFunc(gl.EQUAL, this.maskLevel, 1);\n\t\tgl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);\n\n\t\t// fill the given mask shape\n\t\tthis.fill(mask);\n\n\t\t// flush the compositor\n\t\tthis.flush();\n\n\t\tgl.colorMask(true, true, true, true);\n\n\t\t// Use stencil buffer to affect next rendering object\n\t\tif (invert === true) {\n\t\t\tgl.stencilFunc(gl.EQUAL, this.maskLevel + 1, 1);\n\t\t} else {\n\t\t\tgl.stencilFunc(gl.NOTEQUAL, this.maskLevel + 1, 1);\n\t\t}\n\t\tgl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\n\t}\n\n\t/**\n\t * disable (remove) the rendering mask set through setMask.\n\t * @see WebGLRenderer#setMask\n\t */\n\tclearMask() {\n\t\tif (this.maskLevel > 0) {\n\t\t\t// flush the compositor\n\t\t\tthis.flush();\n\t\t\tthis.maskLevel = 0;\n\t\t\tthis.gl.disable(this.gl.STENCIL_TEST);\n\t\t}\n\t}\n}\n", "import { isWebGLSupported } from \"../../system/device\";\nimport CanvasRenderer from \"../canvas/canvas_renderer\";\nimport WebGLRenderer from \"../webgl/webgl_renderer\";\n\n/**\n * Auto-detect the best renderer to use\n * @ignore\n */\nexport function autoDetectRenderer(options) {\n\ttry {\n\t\tif (isWebGLSupported(options)) {\n\t\t\treturn new WebGLRenderer(options);\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(\"Error creating WebGL renderer :\" + e.message);\n\t}\n\treturn new CanvasRenderer(options);\n}\n", "import * as device from \"../system/device\";\n\n/**\n * additional import for TypeScript\n * @import Application from \"./application.js\";\n */\n\n/**\n * display information\n * @param {Application} app - the game application instance calling this function\n */\nexport function consoleHeader(app) {\n\tlet renderType = app.renderer.type;\n\tlet gpu_renderer =\n\t\ttypeof app.renderer.GPURenderer === \"string\"\n\t\t\t? \" (\" + app.renderer.GPURenderer + \")\"\n\t\t\t: \"\";\n\tlet depthTesting =\n\t\trenderType.includes(\"WebGL\") && app.renderer.depthTest === \"z-buffer\"\n\t\t\t? \"Depth Test | \"\n\t\t\t: \"\";\n\tlet audioType = device.hasWebAudio ? \"Web Audio\" : \"HTML5 Audio\";\n\n\t// output video information in the console\n\tconsole.log(\n\t\trenderType +\n\t\t\t\" renderer\" +\n\t\t\tgpu_renderer +\n\t\t\t\" | \" +\n\t\t\tdepthTesting +\n\t\t\taudioType +\n\t\t\t\" | \" +\n\t\t\t\"pixel ratio \" +\n\t\t\tdevice.devicePixelRatio +\n\t\t\t\" | \" +\n\t\t\t(device.platform.nodeJS\n\t\t\t\t? \"node.js\"\n\t\t\t\t: device.platform.isMobile\n\t\t\t\t\t? \"mobile\"\n\t\t\t\t\t: \"desktop\") +\n\t\t\t\" | \" +\n\t\t\tdevice.getScreenOrientation() +\n\t\t\t\" | \" +\n\t\t\tdevice.language,\n\t);\n\n\tconsole.log(\n\t\t\"resolution: \" +\n\t\t\t\"requested \" +\n\t\t\tapp.settings.width +\n\t\t\t\"x\" +\n\t\t\tapp.settings.height +\n\t\t\t\", got \" +\n\t\t\tapp.renderer.width +\n\t\t\t\"x\" +\n\t\t\tapp.renderer.height,\n\t);\n}\n", "import * as device from \"./../system/device\";\n\n/**\n * additional import for TypeScript\n * @import Application from \"./application.js\";\n */\n\n/**\n * scale the \"displayed\" canvas by the given scalar.\n * this will modify the size of canvas element directly.\n * Only use this if you are not using the automatic scaling feature.\n * @private\n * @param {Application} game - the game application instance triggering the resize\n * @param {number} x - x scaling multiplier\n * @param {number} y - y scaling multiplier\n */\nfunction scale(game, x, y) {\n\tlet renderer = game.renderer;\n\tlet canvas = renderer.getCanvas();\n\tlet context = renderer.getContext();\n\tlet settings = renderer.settings;\n\tlet pixelRatio = device.devicePixelRatio;\n\n\tlet w = (settings.zoomX = canvas.width * x * pixelRatio);\n\tlet h = (settings.zoomY = canvas.height * y * pixelRatio);\n\n\t// update the global scale variable\n\trenderer.scaleRatio.set(x * pixelRatio, y * pixelRatio);\n\n\t// adjust CSS style based on device pixel ratio\n\tcanvas.style.width = w / pixelRatio + \"px\";\n\tcanvas.style.height = h / pixelRatio + \"px\";\n\n\t// if anti-alias and blend mode were resetted (e.g. Canvas mode)\n\trenderer.setAntiAlias(context, settings.antiAlias);\n\trenderer.setBlendMode(settings.blendMode, context);\n\n\t// force repaint\n\tgame.repaint();\n}\n\n/**\n * callback for window resize event\n * @private\n * @param {Application} game - the game application instance triggering the resize\n */\nexport function onresize(game) {\n\tlet renderer = game.renderer;\n\tlet settings = renderer.settings;\n\tlet scaleX = settings.scale,\n\t\tscaleY = settings.scale;\n\tlet nodeBounds;\n\n\tif (settings.autoScale) {\n\t\t// set max the canvas max size if CSS values are defined\n\t\tlet canvasMaxWidth = Infinity;\n\t\tlet canvasMaxHeight = Infinity;\n\n\t\tif (globalThis.getComputedStyle) {\n\t\t\tlet style = globalThis.getComputedStyle(renderer.getCanvas(), null);\n\t\t\tcanvasMaxWidth = parseInt(style.maxWidth, 10) || Infinity;\n\t\t\tcanvasMaxHeight = parseInt(style.maxHeight, 10) || Infinity;\n\t\t}\n\n\t\tif (typeof game.settings.scaleTarget !== \"undefined\") {\n\t\t\t// get the bounds of the given scale target\n\t\t\tnodeBounds = device.getElementBounds(game.settings.scaleTarget);\n\t\t} else {\n\t\t\t// get the maximum canvas size within the parent div containing the canvas container\n\t\t\tnodeBounds = device.getParentBounds(game.getParentElement());\n\t\t}\n\n\t\tlet _max_width = Math.min(canvasMaxWidth, nodeBounds.width);\n\t\tlet _max_height = Math.min(canvasMaxHeight, nodeBounds.height);\n\n\t\t// calculate final canvas width & height\n\t\tlet screenRatio = _max_width / _max_height;\n\n\t\tif (\n\t\t\t(settings.scaleMethod === \"fill-min\" &&\n\t\t\t\tscreenRatio > renderer.designRatio) ||\n\t\t\t(settings.scaleMethod === \"fill-max\" &&\n\t\t\t\tscreenRatio < renderer.designRatio) ||\n\t\t\tsettings.scaleMethod === \"flex-width\"\n\t\t) {\n\t\t\t// resize the display canvas to fill the parent container\n\t\t\tlet sWidth = Math.min(canvasMaxWidth, settings.height * screenRatio);\n\t\t\tscaleX = scaleY = _max_width / sWidth;\n\t\t\trenderer.resize(Math.floor(sWidth), settings.height);\n\t\t} else if (\n\t\t\t(settings.scaleMethod === \"fill-min\" &&\n\t\t\t\tscreenRatio < renderer.designRatio) ||\n\t\t\t(settings.scaleMethod === \"fill-max\" &&\n\t\t\t\tscreenRatio > renderer.designRatio) ||\n\t\t\tsettings.scaleMethod === \"flex-height\"\n\t\t) {\n\t\t\t// resize the display canvas to fill the parent container\n\t\t\tlet sHeight = Math.min(\n\t\t\t\tcanvasMaxHeight,\n\t\t\t\tsettings.width * (_max_height / _max_width),\n\t\t\t);\n\t\t\tscaleX = scaleY = _max_height / sHeight;\n\t\t\trenderer.resize(settings.width, Math.floor(sHeight));\n\t\t} else if (settings.scaleMethod === \"flex\") {\n\t\t\t// resize the display canvas to fill the parent container\n\t\t\trenderer.resize(Math.floor(_max_width), Math.floor(_max_height));\n\t\t} else if (settings.scaleMethod === \"stretch\") {\n\t\t\t// scale the display canvas to fit with the parent container\n\t\t\tscaleX = _max_width / settings.width;\n\t\t\tscaleY = _max_height / settings.height;\n\t\t} else {\n\t\t\t// scale the display canvas to fit the parent container\n\t\t\t// make sure we maintain the original aspect ratio\n\t\t\tif (screenRatio < renderer.designRatio) {\n\t\t\t\tscaleX = scaleY = _max_width / settings.width;\n\t\t\t} else {\n\t\t\t\tscaleX = scaleY = _max_height / settings.height;\n\t\t\t}\n\t\t}\n\t}\n\t// adjust scaling ratio\n\tscale(game, scaleX, scaleY);\n}\n", "import { AUTO, CANVAS, WEBGL } from \"../const.ts\";\nimport World from \"../physics/world.js\";\nimport state from \"../state/state.js\";\nimport * as device from \"../system/device.js\";\nimport {\n\tBLUR,\n\teventEmitter,\n\tFOCUS,\n\tGAME_AFTER_DRAW,\n\tGAME_AFTER_UPDATE,\n\tGAME_BEFORE_DRAW,\n\tGAME_BEFORE_UPDATE,\n\tGAME_INIT,\n\tGAME_RESET,\n\tGAME_UPDATE,\n\tSTAGE_RESET,\n\tSTATE_CHANGE,\n\tSTATE_RESTART,\n\tSTATE_RESUME,\n\tTICK,\n\tWINDOW_ONORIENTATION_CHANGE,\n\tWINDOW_ONRESIZE,\n} from \"../system/event.ts\";\nimport timer from \"../system/timer.ts\";\nimport { getUriFragment } from \"../utils/utils.ts\";\nimport CanvasRenderer from \"../video/canvas/canvas_renderer.js\";\nimport { autoDetectRenderer } from \"../video/utils/autodetect.js\";\nimport { defaultApplicationSettings } from \"./defaultApplicationSettings.ts\";\nimport { consoleHeader } from \"./header.js\";\nimport { onresize } from \"./resize.js\";\nimport { ScaleMethods } from \"./scaleMethods.ts\";\n\n/**\n * additional import for TypeScript\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n * @import Camera2d from \"./../camera/camera2d.js\";\n */\n\n/**\n * An Application represents a single melonJS game, and is responsible for updating (each frame) all the related object status and draw them.\n * @see {@link game}\n */\nexport default class Application {\n\t/**\n\t * @param {number} width - The width of the canvas viewport\n\t * @param {number} height - The height of the canvas viewport\n\t * @param {ApplicationSettings} [options] - The optional parameters for the application and default renderer\n\t * @throws Will throw an exception if it fails to instantiate a renderer\n\t */\n\tconstructor(width, height, options) {\n\t\t/**\n\t\t * the parent HTML element holding the main canvas of this application\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.parentElement = undefined;\n\n\t\t/**\n\t\t * a reference to the active Canvas or WebGL active renderer renderer\n\t\t * @type {CanvasRenderer|WebGLRenderer}\n\t\t */\n\t\tthis.renderer = undefined;\n\n\t\t/**\n\t\t * the active stage \"default\" camera\n\t\t * @type {Camera2d}\n\t\t */\n\t\tthis.viewport = undefined;\n\n\t\t/**\n\t\t * a reference to the game world, <br>\n\t\t * a world is a virtual environment containing all the game objects\n\t\t * @type {World}\n\t\t */\n\t\tthis.world = undefined;\n\n\t\t/**\n\t\t * when true, all objects will be added under the root world container.<br>\n\t\t * When false, a `me.Container` object will be created for each corresponding groups\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.mergeGroup = true;\n\n\t\t/**\n\t\t * Last time the game update loop was executed. <br>\n\t\t * Use this value to implement frame prediction in drawing events,\n\t\t * for creating smooth motion while running game update logic at\n\t\t * a lower fps.\n\t\t * @type {DOMHighResTimeStamp}\n\t\t */\n\t\tthis.lastUpdate = 0;\n\n\t\t/**\n\t\t * true when this app instance has been initialized\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isInitialized = false;\n\n\t\t/**\n\t\t * the given settings used when creating this application\n\t\t * @type {ApplicationSettings}\n\t\t */\n\t\tthis.settings = undefined;\n\n\t\t/**\n\t\t * Specify whether to pause this app when losing focus\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t * @example\n\t\t * // keep the default game instance running even when loosing focus\n\t\t * me.game.pauseOnBlur = false;\n\t\t */\n\t\tthis.pauseOnBlur = true;\n\n\t\t/**\n\t\t * Specify whether to unpause this app when gaining back focus\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resumeOnFocus = true;\n\n\t\t/**\n\t\t * Specify whether to stop this app when losing focus\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stopOnBlur = false;\n\n\t\t// to know when we have to refresh the display\n\t\tthis.isDirty = true;\n\n\t\t// always refresh the display when updatesPerSecond are lower than fps\n\t\tthis.isAlwaysDirty = false;\n\n\t\t// frame counter for frameSkipping\n\t\t// reset the frame counter\n\t\tthis.frameCounter = 0;\n\t\tthis.frameRate = 1;\n\n\t\t// time accumulation for multiple update calls\n\t\tthis.accumulator = 0.0;\n\t\tthis.accumulatorMax = 0.0;\n\t\tthis.accumulatorUpdateDelta = 0;\n\n\t\t// min update step size\n\t\tthis.stepSize = 1000 / 60;\n\t\tthis.updateDelta = 0;\n\t\tthis.lastUpdateStart = null;\n\t\tthis.updateAverageDelta = 0;\n\n\t\t// when using the default game application, legacy is set to true\n\t\t// and init is called through the legacy video.init() call\n\t\tif (options.legacy !== true) {\n\t\t\tthis.init(width, height, options);\n\t\t}\n\t}\n\n\t/**\n\t * init the game instance (create a physic world, update starting time, etc..)\n\t * @param {number} width - The width of the canvas viewport\n\t * @param {number} height - The height of the canvas viewport\n\t * @param {ApplicationSettings} [options] - The optional parameters for the application and default renderer\n\t */\n\tinit(width, height, options) {\n\t\tthis.settings = Object.assign(defaultApplicationSettings, options || {});\n\n\t\t// sanitize potential given parameters\n\t\tthis.settings.width = width;\n\t\tthis.settings.height = height;\n\t\tthis.settings.transparent = !!this.settings.transparent;\n\t\tthis.settings.antiAlias = !!this.settings.antiAlias;\n\t\tthis.settings.failIfMajorPerformanceCaveat =\n\t\t\t!!this.settings.failIfMajorPerformanceCaveat;\n\t\tthis.settings.depthTest =\n\t\t\tthis.settings.depthTest === \"z-buffer\" ? \"z-buffer\" : \"sorting\";\n\t\tthis.settings.subPixel = !!this.settings.subPixel;\n\t\tthis.settings.verbose = !!this.settings.verbose;\n\t\tif (\n\t\t\tthis.settings.scaleMethod.search(\n\t\t\t\t/^(fill-(min|max)|fit|flex(-(width|height))?|stretch)$/,\n\t\t\t) !== -1\n\t\t) {\n\t\t\tthis.settings.autoScale = this.settings.scale === \"auto\" || true;\n\t\t} else {\n\t\t\t// default scaling method\n\t\t\tthis.settings.scaleMethod = ScaleMethods.Fit;\n\t\t\tthis.settings.autoScale = this.settings.scale === \"auto\" || false;\n\t\t}\n\n\t\t// override renderer settings if &webgl or &canvas is defined in the URL\n\t\tlet uriFragment = getUriFragment();\n\t\tif (\n\t\t\turiFragment.webgl === true ||\n\t\t\turiFragment.webgl1 === true ||\n\t\t\turiFragment.webgl2 === true\n\t\t) {\n\t\t\tthis.settings.renderer = WEBGL;\n\t\t\tif (uriFragment.webgl1 === true) {\n\t\t\t\tthis.settings.preferWebGL1 = true;\n\t\t\t}\n\t\t} else if (uriFragment.canvas === true) {\n\t\t\tthis.settings.renderer = CANVAS;\n\t\t}\n\n\t\t// normalize scale\n\t\tthis.settings.scale = this.settings.autoScale\n\t\t\t? 1.0\n\t\t\t: +this.settings.scale || 1.0;\n\n\t\t// default scaled size value\n\t\tthis.settings.zoomX = width * this.settings.scale;\n\t\tthis.settings.zoomY = height * this.settings.scale;\n\n\t\t// identify parent element and/or the html target for resizing\n\t\tthis.parentElement = device.getElement(this.settings.parent);\n\t\tif (typeof this.settings.scaleTarget !== \"undefined\") {\n\t\t\tthis.settings.scaleTarget = device.getElement(this.settings.scaleTarget);\n\t\t}\n\n\t\tif (typeof this.settings.renderer === \"number\") {\n\t\t\tswitch (this.settings.renderer) {\n\t\t\t\tcase AUTO:\n\t\t\t\tcase WEBGL:\n\t\t\t\t\tthis.renderer = autoDetectRenderer(this.settings);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.renderer = new CanvasRenderer(this.settings);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tlet CustomRenderer = this.settings.renderer;\n\t\t\t// a renderer class\n\t\t\tthis.renderer = new CustomRenderer(this.settings);\n\t\t}\n\n\t\t// register to the channel\n\t\teventEmitter.addListener(WINDOW_ONRESIZE, () => {\n\t\t\treturn onresize(this);\n\t\t});\n\t\teventEmitter.addListener(WINDOW_ONORIENTATION_CHANGE, () => {\n\t\t\treturn onresize(this);\n\t\t});\n\n\t\t// add our canvas (default to document.body if settings.parent is undefined)\n\t\tthis.parentElement.appendChild(this.renderer.getCanvas());\n\n\t\t// Mobile browser hacks\n\t\tif (device.platform.isMobile) {\n\t\t\t// Prevent the webview from moving on a swipe\n\t\t\tdevice.enableSwipe(false);\n\t\t}\n\n\t\t// trigger an initial resize();\n\t\tonresize(this);\n\n\t\t// add an observer to detect when the dom tree is modified\n\t\tif (\"MutationObserver\" in globalThis) {\n\t\t\t// Create an observer instance linked to the callback function\n\t\t\tlet observer = new MutationObserver(() => {\n\t\t\t\treturn onresize(this);\n\t\t\t});\n\n\t\t\t// Start observing the target node for configured mutations\n\t\t\tobserver.observe(this.parentElement, {\n\t\t\t\tattributes: false,\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: true,\n\t\t\t});\n\t\t}\n\n\t\tif (this.settings.consoleHeader !== false) {\n\t\t\tconsoleHeader(this);\n\t\t}\n\n\t\t// create a new physic world\n\t\tthis.world = new World(0, 0, this.settings.width, this.settings.height);\n\n\t\t// set the reference to this application instance\n\t\tthis.world.app = this;\n\t\t// set the reference to this application instance\n\t\tthis.world.physic = this.settings.physic;\n\n\t\t// app starting time\n\t\tthis.lastUpdate = globalThis.performance.now();\n\t\t// manually sort child if depthTest setting is \"sorting\"\n\t\tthis.world.autoSort = !(\n\t\t\tthis.renderer.type === \"WEBGL\" && this.settings.depthTest === \"z-buffer\"\n\t\t);\n\n\t\tthis.isInitialized = true;\n\n\t\teventEmitter.emit(GAME_INIT);\n\t\teventEmitter.addListener(STATE_CHANGE, this.repaint.bind(this));\n\t\teventEmitter.addListener(STATE_RESTART, this.repaint.bind(this));\n\t\teventEmitter.addListener(STATE_RESUME, this.repaint.bind(this));\n\t\teventEmitter.addListener(STAGE_RESET, this.reset.bind(this));\n\t\teventEmitter.addListener(TICK, (time) => {\n\t\t\tthis.update(time);\n\t\t\tthis.draw();\n\t\t});\n\n\t\teventEmitter.addListener(BLUR, () => {\n\t\t\tif (this.stopOnBlur === true) {\n\t\t\t\tstate.stop(true);\n\t\t\t}\n\t\t\tif (this.pauseOnBlur === true) {\n\t\t\t\tstate.pause(true);\n\t\t\t}\n\t\t});\n\n\t\teventEmitter.addListener(FOCUS, () => {\n\t\t\tif (this.stopOnBlur === true) {\n\t\t\t\tstate.restart(true);\n\t\t\t}\n\t\t\tif (this.resumeOnFocus === true) {\n\t\t\t\tstate.resume(true);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * reset the game Object manager\n\t * destroy all current objects\n\t */\n\treset() {\n\t\t// point to the current active stage \"default\" camera\n\t\tlet current = state.get();\n\t\tif (typeof current !== \"undefined\") {\n\t\t\tthis.viewport = current.cameras.get(\"default\");\n\t\t}\n\n\t\t// publish reset notification\n\t\teventEmitter.emit(GAME_RESET);\n\n\t\t// Refresh internal variables for framerate limiting\n\t\tthis.updateFrameRate();\n\t}\n\n\t/**\n\t * Specify the property to be used when sorting renderables for this application game world.\n\t * Accepted values : \"x\", \"y\", \"z\", \"depth\"\n\t * @type {string}\n\t * @see {@link World.sortOn}\n\t */\n\tget sortOn() {\n\t\treturn this.world.sortOn;\n\t}\n\tset sortOn(value) {\n\t\tthis.world.sortOn = value;\n\t}\n\n\t/**\n\t * Fired when a level is fully loaded and all renderable instantiated. <br>\n\t * Additionnaly the level id will also be passed to the called function.\n\t * @example\n\t * // call myFunction () everytime a level is loaded\n\t * me.game.onLevelLoaded = this.myFunction.bind(this);\n\t */\n\tonLevelLoaded() {}\n\n\t/**\n\t * Update the renderer framerate using the system config variables.\n\t * @see {@link timer.maxfps}\n\t * @see {@link World.fps}\n\t */\n\tupdateFrameRate() {\n\t\t// reset the frame counter\n\t\tthis.frameCounter = 0;\n\t\tthis.frameRate = ~~(0.5 + 60 / timer.maxfps);\n\n\t\t// set step size based on the updatesPerSecond\n\t\tthis.stepSize = 1000 / this.world.fps;\n\t\tthis.accumulator = 0.0;\n\t\tthis.accumulatorMax = this.stepSize * 10;\n\n\t\t// display should always re-draw when update speed doesn't match fps\n\t\t// this means the user intends to write position prediction drawing logic\n\t\tthis.isAlwaysDirty = timer.maxfps > this.world.fps;\n\t}\n\n\t/**\n\t * Returns the parent HTML Element holding the main canvas of this application\n\t * @returns {HTMLElement} the parent HTML element\n\t */\n\tgetParentElement() {\n\t\treturn this.parentElement;\n\t}\n\n\t/**\n\t * force the redraw (not update) of all objects\n\t */\n\trepaint() {\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * update all objects related to this game active scene/stage\n\t * @param {number} time - current timestamp as provided by the RAF callback\n\t */\n\tupdate(time) {\n\t\t// handle frame skipping if required\n\t\tif (++this.frameCounter % this.frameRate === 0) {\n\t\t\t// reset the frame counter\n\t\t\tthis.frameCounter = 0;\n\n\t\t\t// publish notification\n\t\t\teventEmitter.emit(GAME_BEFORE_UPDATE, time);\n\t\t\tthis.accumulator += timer.getDelta();\n\t\t\tthis.accumulator = Math.min(this.accumulator, this.accumulatorMax);\n\n\t\t\tthis.updateDelta = timer.interpolation ? timer.getDelta() : this.stepSize;\n\t\t\tthis.accumulatorUpdateDelta = timer.interpolation\n\t\t\t\t? this.updateDelta\n\t\t\t\t: Math.max(this.updateDelta, this.updateAverageDelta);\n\n\t\t\twhile (\n\t\t\t\tthis.accumulator >= this.accumulatorUpdateDelta ||\n\t\t\t\ttimer.interpolation\n\t\t\t) {\n\t\t\t\tthis.lastUpdateStart = globalThis.performance.now();\n\n\t\t\t\t// game update event\n\t\t\t\tif (state.isPaused() !== true) {\n\t\t\t\t\teventEmitter.emit(GAME_UPDATE, time);\n\t\t\t\t}\n\n\t\t\t\t// update all objects (and pass the elapsed time since last frame)\n\t\t\t\tthis.isDirty = this.world.update(this.updateDelta);\n\t\t\t\tthis.isDirty = state.current().update(this.updateDelta) || this.isDirty;\n\n\t\t\t\tthis.lastUpdate = globalThis.performance.now();\n\t\t\t\tthis.updateAverageDelta = this.lastUpdate - this.lastUpdateStart;\n\n\t\t\t\tthis.accumulator -= this.accumulatorUpdateDelta;\n\t\t\t\tif (timer.interpolation) {\n\t\t\t\t\tthis.accumulator = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// publish notification\n\t\t\teventEmitter.emit(GAME_AFTER_UPDATE, this.lastUpdate);\n\t\t}\n\t}\n\n\t/**\n\t * draw the active scene/stage associated to this game\n\t */\n\tdraw() {\n\t\tif (\n\t\t\tthis.renderer.isContextValid === true &&\n\t\t\t(this.isDirty || this.isAlwaysDirty)\n\t\t) {\n\t\t\t// publish notification\n\t\t\teventEmitter.emit(GAME_BEFORE_DRAW, globalThis.performance.now());\n\n\t\t\t// prepare renderer to draw a new frame\n\t\t\tthis.renderer.clear();\n\n\t\t\t// render the stage\n\t\t\tstate.current().draw(this.renderer, this.world);\n\n\t\t\t// set back to flag\n\t\t\tthis.isDirty = false;\n\n\t\t\t// flush/render our frame\n\t\t\tthis.renderer.flush();\n\n\t\t\t// publish notification\n\t\t\teventEmitter.emit(GAME_AFTER_DRAW, globalThis.performance.now());\n\t\t}\n\t}\n}\n", "import { clamp, randomFloat } from \"../math/math.ts\";\nimport { Vector2d, vector2dPool } from \"../math/vector2d.ts\";\nimport type Container from \"../renderable/container.js\";\nimport Renderable from \"../renderable/renderable.js\";\nimport { createPool, registerPool } from \"../system/pool.ts\";\nimport timer from \"../system/timer.ts\";\nimport CanvasRenderer from \"../video/canvas/canvas_renderer.js\";\nimport WebGLRenderer from \"../video/webgl/webgl_renderer.js\";\nimport ParticleEmitter from \"./emitter.js\";\n\n/**\n * @import ParticleEmitter from \"./emitter.js\";\n */\n\n/**\n * Single Particle Object.\n */\nexport default class Particle extends Renderable {\n\tvel: Vector2d;\n\timage: any;\n\tlife: number;\n\tstartLife: number;\n\tstartScale: number;\n\tendScale: number;\n\tgravity: number;\n\twind: number;\n\tfollowTrajectory: boolean;\n\tonlyInViewport: boolean;\n\t_deltaInv: number;\n\t_angle: number;\n\talive: boolean;\n\n\t/**\n\t * @param emitter - the particle emitter\n\t */\n\tconstructor(emitter: ParticleEmitter) {\n\t\t// Call the super constructor\n\t\tsuper(\n\t\t\temitter.getRandomPointX(),\n\t\t\temitter.getRandomPointY(),\n\t\t\temitter.settings.image.width,\n\t\t\temitter.settings.image.height,\n\t\t);\n\t\t// particle velocity\n\t\tthis.vel = vector2dPool.get();\n\t\tthis.onResetEvent(emitter, true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonResetEvent(emitter: ParticleEmitter, newInstance: boolean = false) {\n\t\tif (!newInstance) {\n\t\t\tthis.pos.set(emitter.getRandomPointX(), emitter.getRandomPointY());\n\t\t\tthis.resize(emitter.settings.image.width, emitter.settings.image.height);\n\t\t\tthis.currentTransform.identity();\n\t\t}\n\n\t\tthis.image = emitter.settings.image;\n\n\t\t// Particle will always update\n\t\tthis.alwaysUpdate = true;\n\n\t\tif (typeof emitter.settings.tint === \"string\") {\n\t\t\tthis.tint.parseCSS(emitter.settings.tint as any);\n\t\t}\n\n\t\tthis.blendMode = emitter.settings.textureAdditive ? \"additive\" : \"normal\";\n\n\t\tif (emitter.settings.blendMode !== \"normal\") {\n\t\t\tthis.blendMode = emitter.settings.blendMode;\n\t\t}\n\n\t\t// Set the start particle Angle and Speed as defined in emitter\n\t\tconst angle =\n\t\t\temitter.settings.angle +\n\t\t\t(emitter.settings.angleVariation > 0\n\t\t\t\t? (randomFloat(0, 2) - 1) * emitter.settings.angleVariation\n\t\t\t\t: 0);\n\t\tconst speed =\n\t\t\temitter.settings.speed +\n\t\t\t(emitter.settings.speedVariation > 0\n\t\t\t\t? (randomFloat(0, 2) - 1) * emitter.settings.speedVariation\n\t\t\t\t: 0);\n\n\t\t// Set the start particle Velocity\n\t\tthis.vel.set(speed * Math.cos(angle), -speed * Math.sin(angle));\n\n\t\t// Set the start particle Time of Life as defined in emitter\n\t\tthis.life = randomFloat(emitter.settings.minLife, emitter.settings.maxLife);\n\t\tthis.startLife = this.life;\n\n\t\t// Set the start and end particle Scale as defined in emitter\n\t\t// clamp the values as minimum and maximum scales range\n\t\tthis.startScale = clamp(\n\t\t\trandomFloat(\n\t\t\t\temitter.settings.minStartScale,\n\t\t\t\temitter.settings.maxStartScale,\n\t\t\t),\n\t\t\temitter.settings.minStartScale,\n\t\t\temitter.settings.maxStartScale,\n\t\t);\n\t\tthis.endScale = clamp(\n\t\t\trandomFloat(emitter.settings.minEndScale, emitter.settings.maxEndScale),\n\t\t\temitter.settings.minEndScale,\n\t\t\temitter.settings.maxEndScale,\n\t\t);\n\n\t\t// Set the particle Gravity and Wind (horizontal gravity) as defined in emitter\n\t\tthis.gravity = emitter.settings.gravity;\n\t\tthis.wind = emitter.settings.wind;\n\n\t\t// Set if the particle update the rotation in accordance the trajectory\n\t\tthis.followTrajectory = emitter.settings.followTrajectory;\n\n\t\t// Set if the particle update only in Viewport\n\t\tthis.onlyInViewport = emitter.settings.onlyInViewport;\n\n\t\t// cache inverse of the expected delta time\n\t\tthis._deltaInv = timer.maxfps / 1000;\n\n\t\t// Set the start particle rotation as defined in emitter\n\t\t// if the particle not follow trajectory\n\t\tif (!emitter.settings.followTrajectory) {\n\t\t\tthis._angle = randomFloat(\n\t\t\t\temitter.settings.minRotation,\n\t\t\t\temitter.settings.maxRotation,\n\t\t\t);\n\t\t}\n\n\t\tthis.alive = true;\n\t}\n\n\t/**\n\t * Update the Particle <br>\n\t * This is automatically called by the game manager {@link game}\n\t * @ignore\n\t * @param dt - time since the last update in milliseconds\n\t */\n\toverride update(dt: number) {\n\t\t// move things forward independent of the current frame rate\n\t\tconst skew = dt * this._deltaInv;\n\n\t\t// Decrease particle life\n\t\tthis.life = this.life > dt ? this.life - dt : 0;\n\n\t\tif (this.alive && this.life <= 0) {\n\t\t\tconst parent = this.ancestor as Container;\n\t\t\t// use true for keepalive since we recycle the instance directly here after\n\t\t\tparent.removeChild(this, true);\n\t\t\tparticlePool.release(this);\n\t\t\tthis.alive = false;\n\t\t\treturn false;\n\t\t}\n\n\t\t// Calculate the particle Age Ratio\n\t\tconst ageRatio = this.life / this.startLife;\n\n\t\t// Resize the particle as particle Age Ratio\n\t\tlet scale = this.startScale;\n\t\tif (this.startScale > this.endScale) {\n\t\t\tscale *= ageRatio;\n\t\t\tscale = scale < this.endScale ? this.endScale : scale;\n\t\t} else if (this.startScale < this.endScale) {\n\t\t\tscale /= ageRatio;\n\t\t\tscale = scale > this.endScale ? this.endScale : scale;\n\t\t}\n\n\t\t// Set the particle opacity as Age Ratio\n\t\tthis.alpha = ageRatio;\n\n\t\t// Adjust the particle velocity\n\t\tthis.vel.x += this.wind * skew;\n\t\tthis.vel.y += this.gravity * skew;\n\n\t\t// If necessary update the rotation of particle in accordance the particle trajectory\n\t\tconst angle = this.followTrajectory\n\t\t\t? Math.atan2(this.vel.y, this.vel.x)\n\t\t\t: this._angle;\n\n\t\tthis.pos.x += this.vel.x * skew;\n\t\tthis.pos.y += this.vel.y * skew;\n\n\t\t// Update particle transform\n\t\tthis.currentTransform\n\t\t\t.setTransform(scale, 0, 0, 0, scale, 0, this.pos.x, this.pos.y, 1)\n\t\t\t.rotate(angle);\n\n\t\t// mark as dirty if the particle is not dead yet\n\t\tthis.isDirty = this.inViewport || !this.onlyInViewport;\n\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\toverride draw(renderer: CanvasRenderer | WebGLRenderer) {\n\t\tconst w = this.width;\n\t\tconst h = this.height;\n\t\trenderer.drawImage(this.image, 0, 0, w, h, -w / 2, -h / 2, w, h);\n\t}\n}\n\nexport const particlePool = createPool<Particle, [emitter: ParticleEmitter]>(\n\t(emitter) => {\n\t\tconst instance = new Particle(emitter);\n\n\t\treturn {\n\t\t\tinstance,\n\t\t\treset(emitter) {\n\t\t\t\tinstance.onResetEvent(emitter, false);\n\t\t\t},\n\t\t};\n\t},\n);\n\nregisterPool(\"particle\", particlePool);\n", "/**\n * ParticleEmitterSettings contains the default settings for ParticleEmitter\n * @see {@link ParticleEmitter}\n * @namespace ParticleEmitterSettings\n */\nconst ParticleEmitterSettings = {\n\t/**\n\t * Width of the particle spawn area.\n\t * @type {number}\n\t * @default 1\n\t */\n\twidth: 1,\n\n\t/**\n\t * Height of the particle spawn area\n\t * @type {number}\n\t * @default 1\n\t */\n\theight: 1,\n\n\t/**\n\t * image used for particles texture\n\t * (by default melonJS will create an white 8x8 texture image)\n\t * @type {HTMLCanvasElement}\n\t * @default undefined\n\t * @see {@link textureSize}\n\t */\n\timage: undefined,\n\n\t/**\n\t * default texture size used for particles if no image is specified\n\t * (by default melonJS will create an white 8x8 texture image)\n\t * @type {number}\n\t * @default 8\n\t * @see {@link image}\n\t */\n\ttextureSize: 8,\n\n\t/**\n\t * tint to be applied to particles\n\t * @type {string}\n\t * @default \"#fff\"\n\t */\n\ttint: \"#fff\",\n\n\t/**\n\t * Total number of particles in the emitter\n\t * @type {number}\n\t * @default 50\n\t */\n\ttotalParticles: 50,\n\n\t/**\n\t * Start angle for particle launch in Radians\n\t * @type {number}\n\t * @default Math.PI / 2\n\t */\n\tangle: Math.PI / 2,\n\n\t/**\n\t * letiation in the start angle for particle launch in Radians.\n\t * @type {number}\n\t * @default 0\n\t */\n\tangleVariation: 0,\n\n\t/**\n\t * Minimum time each particle lives once it is emitted in ms.\n\t * @type {number}\n\t * @default 1000\n\t */\n\tminLife: 1000,\n\n\t/**\n\t * Maximum time each particle lives once it is emitted in ms.\n\t * @type {number}\n\t * @default 3000\n\t */\n\tmaxLife: 3000,\n\n\t/**\n\t * Start speed of particles.<br>\n\t * @type {number}\n\t * @default 2\n\t */\n\tspeed: 2,\n\n\t/**\n\t * letiation in the start speed of particles\n\t * @type {number}\n\t * @default 1\n\t */\n\tspeedVariation: 1,\n\n\t/**\n\t * Minimum start rotation for particles sprites in Radians\n\t * @type {number}\n\t * @default 0\n\t */\n\tminRotation: 0,\n\n\t/**\n\t * Maximum start rotation for particles sprites in Radians\n\t * @type {number}\n\t * @default 0\n\t */\n\tmaxRotation: 0,\n\n\t/**\n\t * Minimum start scale ratio for particles (1 = no scaling)\n\t * @type {number}\n\t * @default 1\n\t */\n\tminStartScale: 1,\n\n\t/**\n\t * Maximum start scale ratio for particles (1 = no scaling)\n\t * @type {number}\n\t * @default 1\n\t */\n\tmaxStartScale: 1,\n\n\t/**\n\t * Minimum end scale ratio for particles\n\t * @type {number}\n\t * @default 0\n\t */\n\tminEndScale: 0,\n\n\t/**\n\t * Maximum end scale ratio for particles\n\t * @type {number}\n\t * @default 0\n\t */\n\tmaxEndScale: 0,\n\n\t/**\n\t * Vertical force (Gravity) for each particle\n\t * @type {number}\n\t * @default 0\n\t * @see {@link World.gravity}\n\t */\n\tgravity: 0,\n\n\t/**\n\t * Horizontal force (like a Wind) for each particle\n\t * @type {number}\n\t * @default 0\n\t */\n\twind: 0,\n\n\t/**\n\t * Update the rotation of particle in accordance the particle trajectory.<br>\n\t * The particle sprite should aim at zero angle (draw from left to right).<br>\n\t * Override the particle minRotation and maxRotation.<br>\n\t * @type {boolean}\n\t * @default false\n\t */\n\tfollowTrajectory: false,\n\n\t/**\n\t * Enable the Texture Additive by composite operation (\"additive\" blendMode)\n\t * @type {boolean}\n\t * @default false\n\t * @see {@link blendMode}\n\t */\n\ttextureAdditive: false,\n\n\t/**\n\t * the blend mode to be applied when rendering particles.\n\t * (note: this will superseed the `textureAdditive` setting if different than \"normal\")\n\t * @type {string}\n\t * @default normal\n\t * @see {@link CanvasRenderer#setBlendMode}\n\t * @see {@link WebGLRenderer#setBlendMode}\n\t */\n\tblendMode: \"normal\",\n\n\t/**\n\t * Update particles only in the viewport, remove it when out of viewport.\n\t * @type {boolean}\n\t * @default true\n\t */\n\tonlyInViewport: true,\n\n\t/**\n\t * Render particles in screen space.\n\t * @type {boolean}\n\t * @default false\n\t */\n\tfloating: false,\n\n\t/**\n\t * Maximum number of particles launched each time in this emitter (used only if emitter is Stream).\n\t * @type {number}\n\t * @default 10\n\t */\n\tmaxParticles: 10,\n\n\t/**\n\t * How often a particle is emitted in ms (used only if emitter is a Stream).\n\t * @type {number}\n\t * @default 100\n\t */\n\tfrequency: 100,\n\n\t/**\n\t * Duration that the emitter releases particles in ms (used only if emitter is Stream).\n\t * After this period, the emitter stop the launch of particles.\n\t * @type {number}\n\t * @default Infinity\n\t */\n\tduration: Infinity,\n\n\t/**\n\t * Skip n frames after updating the particle system once.\n\t * This can be used to reduce the performance impact of emitters with many particles.\n\t * @type {number}\n\t * @default 0\n\t */\n\tframesToSkip: 0,\n};\n\nexport default ParticleEmitterSettings;\n", "import { randomFloat } from \"./../math/math.ts\";\nimport Container from \"./../renderable/container.js\";\nimport CanvasRenderTarget from \"../video/rendertarget/canvasrendertarget.js\";\nimport { particlePool } from \"./particle.ts\";\nimport ParticleEmitterSettings from \"./settings.js\";\n\n/**\n * @ignore\n */\nfunction createDefaultParticleTexture(w = 8, h = 8) {\n\tconst defaultParticleTexture = new CanvasRenderTarget(w, h, {\n\t\toffscreenCanvas: true,\n\t});\n\n\tdefaultParticleTexture.context.fillStyle = \"#fff\";\n\tdefaultParticleTexture.context.fillRect(0, 0, w, h);\n\n\treturn defaultParticleTexture;\n}\n\n/**\n * Particle Emitter Object.\n */\nexport default class ParticleEmitter extends Container {\n\t/**\n\t * @param {number} x - x position of the particle emitter\n\t * @param {number} y - y position of the particle emitter\n\t * @param {ParticleEmitterSettings} [settings=ParticleEmitterSettings] - the settings for the particle emitter.\n\t * @example\n\t * // Create a particle emitter at position 100, 100\n\t * let emitter = new ParticleEmitter(100, 100, {\n\t * width: 16,\n\t * height : 16,\n\t * tint: \"#f00\",\n\t * totalParticles: 32,\n\t * angle: 0,\n\t * angleVariation: 6.283185307179586,\n\t * maxLife: 5,\n\t * speed: 3\n\t * });\n\t *\n\t * // Add the emitter to the game world\n\t * me.game.world.addChild(emitter);\n\t *\n\t * // Launch all particles one time and stop, like a explosion\n\t * emitter.burstParticles();\n\t *\n\t * // Launch constantly the particles, like a fountain\n\t * emitter.streamParticles();\n\t *\n\t * // At the end, remove emitter from the game world\n\t * // call this in onDestroyEvent function\n\t * me.game.world.removeChild(emitter);\n\t */\n\tconstructor(x, y, settings = {}) {\n\t\t// call the super constructor\n\t\tsuper(x, y, settings.width | 1, settings.height | 1);\n\n\t\t/**\n\t\t * the current (active) emitter settings\n\t\t * @type {ParticleEmitterSettings}\n\t\t */\n\t\tthis.settings = {};\n\n\t\t// center the emitter around the given coordinates\n\t\tthis.centerOn(x, y);\n\n\t\t// Emitter is Stream, launch particles constantly\n\t\t/** @ignore */\n\t\tthis._stream = false;\n\n\t\t// Frequency timer (in ms) for emitter launch new particles\n\t\t// used only in stream emitter\n\t\t/** @ignore */\n\t\tthis._frequencyTimer = 0;\n\n\t\t// Time of live (in ms) for emitter launch new particles\n\t\t// used only in stream emitter\n\t\t/** @ignore */\n\t\tthis._durationTimer = 0;\n\n\t\t// Emitter is emitting particles\n\t\t/** @ignore */\n\t\tthis._enabled = false;\n\n\t\t// Emitter will always update\n\t\tthis.alwaysUpdate = true;\n\n\t\t// don't sort the particles by z-index\n\t\tthis.autoSort = false;\n\n\t\t// count the updates\n\t\tthis._updateCount = 0;\n\n\t\t// internally store how much time was skipped when frames are skipped\n\t\tthis._dt = 0;\n\n\t\t//this.anchorPoint.set(0, 0);\n\n\t\t// Reset the emitter to defaults\n\t\tthis.reset(settings);\n\t}\n\n\t/**\n\t * Reset the emitter with particle emitter settings.\n\t * @param {ParticleEmitterSettings} settings - [optional] object with emitter settings. See {@link ParticleEmitterSettings}\n\t */\n\treset(settings = {}) {\n\t\tObject.assign(this.settings, ParticleEmitterSettings, settings);\n\n\t\tif (typeof this.settings.image === \"undefined\") {\n\t\t\tthis._defaultParticle = createDefaultParticleTexture(\n\t\t\t\tsettings.textureSize,\n\t\t\t\tsettings.textureSize,\n\t\t\t);\n\t\t\tthis.settings.image = this._defaultParticle.canvas;\n\t\t}\n\n\t\tthis.floating = this.settings.floating;\n\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * returns a random point on the x axis within the bounds of this emitter\n\t * @returns {number}\n\t */\n\tgetRandomPointX() {\n\t\treturn randomFloat(0, this.getBounds().width);\n\t}\n\n\t/**\n\t * returns a random point on the y axis within the bounds this emitter\n\t * @returns {number}\n\t */\n\tgetRandomPointY() {\n\t\treturn randomFloat(0, this.getBounds().height);\n\t}\n\n\t// Add count particles in the game world\n\t/** @ignore */\n\taddParticles(count) {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\t// Add particle to the container\n\t\t\tthis.addChild(particlePool.get(this), this.pos.z);\n\t\t}\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * Emitter is of type stream and is launching particles\n\t * @returns {boolean} Emitter is Stream and is launching particles\n\t */\n\tisRunning() {\n\t\treturn this._enabled && this._stream;\n\t}\n\n\t/**\n\t * Launch particles from emitter constantly (e.g. for stream)\n\t * @param {number} [duration] - time that the emitter releases particles in ms\n\t */\n\tstreamParticles(duration) {\n\t\tthis._enabled = true;\n\t\tthis._stream = true;\n\t\tthis.settings.frequency = Math.max(1, this.settings.frequency);\n\t\tthis._durationTimer =\n\t\t\ttypeof duration === \"number\" ? duration : this.settings.duration;\n\t}\n\n\t/**\n\t * Stop the emitter from generating new particles (used only if emitter is Stream)\n\t */\n\tstopStream() {\n\t\tthis._enabled = false;\n\t}\n\n\t/**\n\t * Launch all particles from emitter and stop (e.g. for explosion)\n\t * @param {number} [total] - number of particles to launch\n\t */\n\tburstParticles(total) {\n\t\tthis._enabled = true;\n\t\tthis._stream = false;\n\t\tthis.addParticles(\n\t\t\ttypeof total === \"number\" ? total : this.settings.totalParticles,\n\t\t);\n\t\tthis._enabled = false;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(dt) {\n\t\t// skip frames if necessary\n\t\tif (++this._updateCount > this.settings.framesToSkip) {\n\t\t\tthis._updateCount = 0;\n\t\t}\n\t\tif (this._updateCount > 0) {\n\t\t\tthis._dt += dt;\n\t\t\treturn this.isDirty;\n\t\t}\n\n\t\t// apply skipped delta time\n\t\tdt += this._dt;\n\t\tthis._dt = 0;\n\n\t\t// Update particles\n\t\tthis.isDirty |= super.update(dt);\n\n\t\t// Launch new particles, if emitter is Stream\n\t\tif (this._enabled && this._stream) {\n\t\t\t// Check if the emitter has duration set\n\t\t\tif (this._durationTimer !== Infinity) {\n\t\t\t\tthis._durationTimer -= dt;\n\n\t\t\t\tif (this._durationTimer <= 0) {\n\t\t\t\t\tthis.stopStream();\n\t\t\t\t\treturn this.isDirty;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase the emitter launcher timer\n\t\t\tthis._frequencyTimer += dt;\n\n\t\t\t// Check for new particles launch\n\t\t\tconst particlesCount = this.children.length;\n\t\t\tif (\n\t\t\t\tparticlesCount < this.settings.totalParticles &&\n\t\t\t\tthis._frequencyTimer >= this.settings.frequency\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tparticlesCount + this.settings.maxParticles <=\n\t\t\t\t\tthis.settings.totalParticles\n\t\t\t\t) {\n\t\t\t\t\tthis.addParticles(this.settings.maxParticles);\n\t\t\t\t} else {\n\t\t\t\t\tthis.addParticles(this.settings.totalParticles - particlesCount);\n\t\t\t\t}\n\t\t\t\tthis._frequencyTimer = 0;\n\t\t\t\tthis.isDirty = true;\n\t\t\t}\n\t\t}\n\t\treturn this.isDirty;\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// call the parent destroy method\n\t\tsuper.destroy(arguments);\n\t\t// clean emitter specific Properties\n\t\tif (typeof this._defaultParticle !== \"undefined\") {\n\t\t\tthis._defaultParticle.destroy();\n\t\t\tthis._defaultParticle = undefined;\n\t\t}\n\t\tthis.settings.image = undefined;\n\t\tthis.settings = undefined;\n\t}\n}\n", "import { game } from \"../index.js\";\nimport { checkVersion } from \"./../utils/utils.ts\";\nimport { version } from \"./../version.ts\";\n\n/**\n * @import Application from \"./../application/application.js\";\n */\n\n/**\n * Contains all registered plugins.\n * @name cache\n * @memberof plugin\n * @type {Object.<plugin.BasePlugin>}\n */\nexport const cache = {};\n\n/**\n * @namespace plugin\n */\n\n/**\n * a base Object class for plugin\n * (plugin must be installed using the register function)\n * @memberof plugin\n */\nexport class BasePlugin {\n\t/**\n\t * @param {Application} [app] - a reference to the app/game that registered this plugin\n\t */\n\tconstructor(app = game) {\n\t\t/**\n\t\t * define the minimum required version of melonJS<br>\n\t\t * this can be overridden by the plugin\n\t\t */\n\t\tthis.version = version;\n\n\t\t/**\n\t\t * a reference to the app/game that registered this plugin\n\t\t * @type {Application}\n\t\t */\n\t\tthis.app = app;\n\t}\n}\n\n/**\n * patch a melonJS function\n * @name patch\n * @memberof plugin\n * @param {object} proto - target object\n * @param {string} name - target function\n * @param {Function} fn - replacement function\n * @example\n * // redefine the me.game.update function with a new one\n * me.plugin.patch(me.game, \"update\", function () {\n * // display something in the console\n * console.log(\"duh\");\n * // call the original me.game.update function\n * this._patched();\n * });\n */\nexport function patch(proto, name, fn) {\n\t// use the object prototype if possible\n\tif (typeof proto.prototype !== \"undefined\") {\n\t\tproto = proto.prototype;\n\t}\n\t// reuse the logic behind object extends\n\tif (typeof proto[name] === \"function\") {\n\t\t// save the original function\n\t\tconst _parent = proto[name];\n\t\t// override the function with the new one\n\t\tObject.defineProperty(proto, name, {\n\t\t\tconfigurable: true,\n\t\t\tvalue: (function (name, fn) {\n\t\t\t\treturn function () {\n\t\t\t\t\tthis._patched = _parent;\n\t\t\t\t\tconst ret = fn.apply(this, arguments);\n\t\t\t\t\tthis._patched = null;\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t})(name, fn),\n\t\t});\n\t} else {\n\t\tthrow new Error(name + \" is not an existing function\");\n\t}\n}\n\n/**\n * Register a plugin.\n * @name register\n * @memberof plugin\n * @param {plugin.BasePlugin} plugin - Plugin object to instantiate and register\n * @param {string} [name=plugin.constructor.name] - a unique name for this plugin\n * @param {...*} [args] - all extra parameters will be passed to the plugin constructor\n * @example\n * // register a new plugin\n * me.plugin.register(TestPlugin, \"testPlugin\");\n * // the `testPlugin` class instance can also be accessed through me.plugin.cache\n * me.plugin.cache.testPlugin.myfunction ();\n */\nexport function register(plugin, name = plugin.toString().match(/ (\\w+)/)[1]) {\n\t// ensure me.plugins[name] is not already \"used\"\n\tif (cache[name]) {\n\t\tthrow new Error(\"plugin \" + name + \" already registered\");\n\t}\n\n\t// get extra arguments\n\tlet _args = [];\n\tif (arguments.length > 2) {\n\t\t// store extra arguments if any\n\t\t_args = Array.prototype.slice.call(arguments, 1);\n\t}\n\n\t// try to instantiate the plugin\n\t_args[0] = plugin;\n\tconst instance = new (plugin.bind.apply(plugin, _args))();\n\n\t// inheritance check\n\tif (typeof instance === \"undefined\" || !(instance instanceof BasePlugin)) {\n\t\tthrow new Error(\"Plugin should extend the BasePlugin Class !\");\n\t}\n\n\t// compatibility testing\n\tif (checkVersion(instance.version, version) > 0) {\n\t\tthrow new Error(\n\t\t\t\"Plugin version mismatch, expected: \" +\n\t\t\t\tinstance.version +\n\t\t\t\t\", got: \" +\n\t\t\t\tversion,\n\t\t);\n\t}\n\n\t// create a reference to the new plugin\n\tcache[name] = instance;\n}\n\n/**\n * returns the the plugin instance with the specified class type or registered name\n * @name get\n * @memberof plugin\n * @param {object|string} classType - the Class Object or registered name of the plugin to retreive\n * @returns {plugin.BasePlugin} a plugin instance or undefined\n */\nexport function get(classType) {\n\tfor (const name in cache) {\n\t\tif (\n\t\t\t(typeof classType === \"string\" && classType === name) ||\n\t\t\tcache[name] instanceof classType\n\t\t) {\n\t\t\treturn cache[name];\n\t\t}\n\t}\n}\n", "/**\n * current melonJS version\n */\nexport const version = __VERSION__;\n", "import { polygonPool } from \"../geometries/polygon.ts\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport Body from \"./../physics/body.js\";\nimport { collision } from \"./../physics/collision.js\";\nimport Sprite from \"./sprite.js\";\n\n/**\n * a basic collectable helper class for immovable object (e.g. a coin)\n */\nexport default class Collectable extends Sprite {\n\t/**\n\t * @param {number} x - the x coordinates of the collectable\n\t * @param {number} y - the y coordinates of the collectable\n\t * @param {object} settings - See {@link Sprite}\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the super constructor\n\t\tsuper(x, y, settings);\n\n\t\tthis.name = settings.name;\n\t\tthis.type = settings.type;\n\t\tthis.id = settings.id;\n\n\t\t// add and configure the physic body\n\t\tlet shape = settings.shapes;\n\t\tif (typeof shape === \"undefined\") {\n\t\t\tshape = polygonPool.get(0, 0, [\n\t\t\t\tvector2dPool.get(0, 0),\n\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t]);\n\t\t}\n\t\tthis.body = new Body(this, shape);\n\t\tthis.body.collisionType = collision.types.COLLECTABLE_OBJECT;\n\t\t// by default only collides with PLAYER_OBJECT\n\t\tthis.body.setCollisionMask(collision.types.PLAYER_OBJECT);\n\t\tthis.body.setStatic(true);\n\n\t\t// Update anchorPoint\n\t\tif (settings.anchorPoint) {\n\t\t\tthis.anchorPoint.set(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t} else {\n\t\t\t// for backward compatibility\n\t\t\tthis.anchorPoint.set(0, 0);\n\t\t}\n\t}\n}\n", "import { colorPool } from \"../math/color.ts\";\nimport Renderable from \"./renderable.js\";\n\n/**\n * additional import for TypeScript\n * @import {Color} from \"./../math/color.ts\";\n * @import CanvasRenderer from \"./../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n * @import Camera2d from \"./../camera/camera2d.js\";\n */\n\n/**\n * a generic Color Layer Object. Fills the entire Canvas with the color not just the container the object belongs to.\n */\nexport default class ColorLayer extends Renderable {\n\t/**\n\t * @param {string} name - Layer name\n\t * @param {Color|string} color - CSS color\n\t * @param {number} [z = 0] - z-index position\n\t */\n\tconstructor(name, color, z) {\n\t\t// parent constructor\n\t\tsuper(0, 0, Infinity, Infinity);\n\n\t\t/**\n\t\t * the layer color component\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = colorPool.get().parseCSS(color);\n\n\t\tthis.onResetEvent(name, color, z);\n\t}\n\n\tonResetEvent(name, color, z = 0) {\n\t\t// apply given parameters\n\t\tthis.name = name;\n\t\tthis.pos.z = z;\n\t\tthis.floating = true;\n\t\t// string (#RGB, #ARGB, #RRGGBB, #AARRGGBB)\n\t\tthis.color.parseCSS(color);\n\t}\n\n\t/**\n\t * draw this color layer (automatically called by melonJS)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer, viewport) {\n\t\trenderer.save();\n\t\trenderer.clipRect(0, 0, viewport.width, viewport.height);\n\t\trenderer.clearColor(this.color);\n\t\trenderer.restore();\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tcolorPool.release(this.color);\n\t\tthis.color = undefined;\n\t\tsuper.destroy();\n\t}\n}\n", "import * as input from \"./../input/input.js\";\nimport { Vector2d } from \"../math/vector2d.ts\";\nimport Renderable from \"./../renderable/renderable.js\";\nimport {\n\tDRAGEND,\n\tDRAGSTART,\n\teventEmitter,\n\tPOINTERMOVE,\n} from \"../system/event.ts\";\n\n/**\n * A Draggable base object\n * @see DropTarget\n */\nexport class Draggable extends Renderable {\n\t/**\n\t * @param {number} x - the x coordinates of the draggable object\n\t * @param {number} y - the y coordinates of the draggable object\n\t * @param {number} width - draggable object width\n\t * @param {number} height - draggable object height\n\t */\n\tconstructor(x, y, width, height) {\n\t\tsuper(x, y, width, height);\n\t\tthis.isKinematic = false;\n\t\tthis.dragging = false;\n\t\tthis.dragId = null;\n\t\tthis.grabOffset = new Vector2d(0, 0);\n\t\tthis.initEvents();\n\t}\n\n\t/**\n\t * Initializes the events the modules needs to listen to\n\t * It translates the pointer events to me.events\n\t * in order to make them pass through the system and to make\n\t * this module testable. Then we subscribe this module to the\n\t * transformed events.\n\t * @private\n\t */\n\tinitEvents() {\n\t\tinput.registerPointerEvent(\"pointerdown\", this, (e) => {\n\t\t\teventEmitter.emit(DRAGSTART, e, this);\n\t\t});\n\t\tinput.registerPointerEvent(\"pointerup\", this, (e) => {\n\t\t\teventEmitter.emit(DRAGEND, e, this);\n\t\t});\n\t\tinput.registerPointerEvent(\"pointercancel\", this, (e) => {\n\t\t\teventEmitter.emit(DRAGEND, e, this);\n\t\t});\n\n\t\tthis.handlePointerMove = (e) => {\n\t\t\tthis.dragMove(e);\n\t\t};\n\n\t\tthis.handleDragStart = (e, draggable) => {\n\t\t\tif (draggable === this) {\n\t\t\t\tthis.dragStart(e);\n\t\t\t}\n\t\t};\n\n\t\tthis.handleDragEnd = (e, draggable) => {\n\t\t\tif (draggable === this) {\n\t\t\t\tthis.dragEnd(e);\n\t\t\t}\n\t\t};\n\n\t\teventEmitter.addListener(POINTERMOVE, this.handlePointerMove);\n\t\teventEmitter.addListener(DRAGSTART, this.handleDragStart);\n\t\teventEmitter.addListener(DRAGEND, this.handleDragEnd);\n\t}\n\n\t/**\n\t * Gets called when the user starts dragging the entity\n\t * @param {object} e - the pointer event\n\t * @returns {boolean} false if the object is being dragged\n\t */\n\tdragStart(e) {\n\t\tif (this.dragging === false) {\n\t\t\tthis.dragging = true;\n\t\t\tthis.grabOffset.set(e.gameX, e.gameY);\n\t\t\tthis.grabOffset.sub(this.pos);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Gets called when the user drags this entity around\n\t * @param {object} e - the pointer event\n\t */\n\tdragMove(e) {\n\t\tif (this.dragging === true) {\n\t\t\tthis.pos.set(e.gameX, e.gameY, this.pos.z); //TODO : z ?\n\t\t\tthis.pos.sub(this.grabOffset);\n\t\t}\n\t}\n\n\t/**\n\t * Gets called when the user stops dragging the entity\n\t * @returns {boolean} false if the object stopped being dragged\n\t */\n\tdragEnd() {\n\t\tif (this.dragging === true) {\n\t\t\tthis.dragging = false;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Destructor\n\t * @ignore\n\t */\n\tdestroy() {\n\t\teventEmitter.removeListener(POINTERMOVE, this.handlePointerMove);\n\t\teventEmitter.removeListener(DRAGSTART, this.handleDragStart);\n\t\teventEmitter.removeListener(DRAGEND, this.handleDragEnd);\n\t\tinput.releasePointerEvent(\"pointerdown\", this);\n\t\tinput.releasePointerEvent(\"pointerup\", this);\n\t\tinput.releasePointerEvent(\"pointercancel\", this);\n\t\tsuper.destroy();\n\t}\n}\n", "import Renderable from \"./../renderable/renderable.js\";\nimport { DRAGEND, eventEmitter } from \"../system/event.ts\";\n\n/**\n * additional import for TypeScript\n * @import { Draggable } from \"./draggable.js\";\n */\n\n/**\n * a base drop target object\n * @see Draggable\n */\nexport class DropTarget extends Renderable {\n\t/**\n\t * @param {number} x - the x coordinates of the drop target\n\t * @param {number} y - the y coordinates of the drop target\n\t * @param {number} width - drop target width\n\t * @param {number} height - drop target height\n\t */\n\tconstructor(x, y, width, height) {\n\t\tsuper(x, y, width, height);\n\n\t\tthis.isKinematic = false;\n\n\t\t/**\n\t\t * constant for the overlaps method\n\t\t * @constant\n\t\t * @type {string}\n\t\t * @name CHECKMETHOD_OVERLAP\n\t\t */\n\t\tthis.CHECKMETHOD_OVERLAP = \"overlaps\";\n\n\t\t/**\n\t\t * constant for the contains method\n\t\t * @constant\n\t\t * @type {string}\n\t\t * @name CHECKMETHOD_CONTAINS\n\t\t */\n\t\tthis.CHECKMETHOD_CONTAINS = \"contains\";\n\n\t\t/**\n\t\t * the checkmethod we want to use\n\t\t * @constant\n\t\t * @type {string}\n\t\t * @name checkMethod\n\t\t * @default \"CHECKMETHOD_OVERLAP\"\n\t\t */\n\t\tthis.checkMethod = this.CHECKMETHOD_OVERLAP;\n\n\t\tthis.removeDragEndListener = eventEmitter.addListener(\n\t\t\tDRAGEND,\n\t\t\tthis.checkOnMe.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Sets the collision method which is going to be used to check a valid drop\n\t * @param {string} checkMethod - the checkmethod (defaults to CHECKMETHOD_OVERLAP)\n\t */\n\tsetCheckMethod(checkMethod) {\n\t\t// We can improve this check,\n\t\t// because now you can use every method in theory\n\t\tif (typeof this.getBounds()[this.checkMethod] === \"function\") {\n\t\t\tthis.checkMethod = checkMethod;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a dropped entity is dropped on the current entity\n\t * @param {object} e - the triggering event\n\t * @param {Draggable} draggable - the draggable object that is dropped\n\t */\n\tcheckOnMe(e, draggable) {\n\t\tif (\n\t\t\tdraggable &&\n\t\t\tthis.getBounds()[this.checkMethod](draggable.getBounds())\n\t\t) {\n\t\t\t// call the drop method on the current entity\n\t\t\tthis.drop(draggable);\n\t\t}\n\t}\n\n\t/**\n\t * Gets called when a draggable entity is dropped on the current entity\n\t * @param {Draggable} draggable - the draggable object that is dropped\n\t */\n\tdrop() {}\n\n\t/**\n\t * Destructor\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tthis.removeDragEndListener();\n\t\tsuper.destroy();\n\t}\n}\n", "import { polygonPool } from \"../../geometries/polygon.ts\";\nimport { vector2dPool } from \"../../math/vector2d.ts\";\nimport Body from \"../../physics/body.js\";\nimport Renderable from \"../renderable.js\";\nimport Sprite from \"../sprite.js\";\n\n/**\n * @import {Line} from \"./../../geometries/line.ts\";\n * @import {Rect} from \"./../../geometries/rectangle.ts\";\n * @import {Ellipse} from \"./../../geometries/ellipse.ts\";\n * @import {Polygon} from \"../../geometries/polygon.ts\";\n * @import {Bounds} from \"./../../physics/bounds.ts\";\n * @import CanvasRenderer from \"./../../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../../video/webgl/webgl_renderer.js\";\n **/\n\n/**\n * a Generic Object Entity\n */\nexport default class Entity extends Renderable {\n\t/**\n\t * @param {number} x - the x coordinates of the entity object\n\t * @param {number} y - the y coordinates of the entity object\n\t * @param {object} settings - Entity properties, to be defined through Tiled or when calling the entity constructor\n\t * <img src=\"../../images/object_properties.png\"/>\n\t * @param {number} settings.width - the physical width the entity takes up in game\n\t * @param {number} settings.height - the physical height the entity takes up in game\n\t * @param {string} [settings.name] - object entity name\n\t * @param {string} [settings.id] - object unique IDs\n\t * @param {Image|string} [settings.image] - resource name of a spritesheet to use for the entity renderable component\n\t * @param {Vector2d} [settings.anchorPoint=0.0] - Entity anchor point\n\t * @param {number} [settings.framewidth=settings.width] - width of a single frame in the given spritesheet\n\t * @param {number} [settings.frameheight=settings.width] - height of a single frame in the given spritesheet\n\t * @param {string} [settings.type] - object type\n\t * @param {number} [settings.collisionMask] - Mask collision detection for this object\n\t * @param {Rect[]|Polygon[]|Line[]|Ellipse[]} [settings.shapes] - the initial list of collision shapes (usually populated through Tiled)\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the super constructor\n\t\tsuper(x, y, settings.width, settings.height);\n\n\t\t/**\n\t\t * The array of renderable children of this entity.\n\t\t * @ignore\n\t\t */\n\t\tthis.children = [];\n\n\t\tif (settings.image) {\n\t\t\t// set the frame size to the given entity size, if not defined in settings\n\t\t\tsettings.framewidth = settings.framewidth || settings.width;\n\t\t\tsettings.frameheight = settings.frameheight || settings.height;\n\t\t\tthis.renderable = new Sprite(0, 0, settings);\n\t\t}\n\n\t\t// Update anchorPoint\n\t\tif (settings.anchorPoint) {\n\t\t\tthis.anchorPoint.setMuted(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t} else {\n\t\t\t// for backward compatibility\n\t\t\tthis.anchorPoint.setMuted(0, 0);\n\t\t}\n\n\t\t// set the sprite name if specified\n\t\tif (typeof settings.name === \"string\") {\n\t\t\tthis.name = settings.name;\n\t\t}\n\n\t\t/**\n\t\t * object type (as defined in Tiled)\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = settings.type || \"\";\n\n\t\t/**\n\t\t * object unique ID (as defined in Tiled)\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = settings.id || \"\";\n\n\t\t/**\n\t\t * dead/living state of the entity<br>\n\t\t * default value : true\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.alive = true;\n\n\t\t// initialize the default body\n\t\tif (typeof settings.shapes === \"undefined\") {\n\t\t\tsettings.shapes = polygonPool.get(0, 0, [\n\t\t\t\tvector2dPool.get(0, 0),\n\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t\tvector2dPool.get(0, this.height),\n\t\t\t]);\n\t\t}\n\n\t\t/**\n\t\t * the entity body object\n\t\t * @type {Body}\n\t\t */\n\t\tthis.body = new Body(this, settings.shapes, () => {\n\t\t\treturn this.onBodyUpdate();\n\t\t});\n\n\t\t// resize the entity if required\n\t\tif (this.width === 0 && this.height === 0) {\n\t\t\tthis.resize(this.body.getBounds().width, this.body.getBounds().height);\n\t\t}\n\n\t\t// set the collision mask and type (if defined)\n\t\tthis.body.setCollisionMask(settings.collisionMask);\n\t\tthis.body.setCollisionType(settings.collisionType);\n\n\t\t// disable for entities\n\t\tthis.autoTransform = false;\n\t}\n\n\t/**\n\t * The entity renderable component (can be any objects deriving from me.Renderable, like me.Sprite for example)\n\t * @type {Renderable}\n\t */\n\n\tget renderable() {\n\t\treturn this.children[0];\n\t}\n\n\tset renderable(value) {\n\t\tif (value instanceof Renderable) {\n\t\t\tthis.children[0] = value;\n\t\t\tthis.children[0].ancestor = this;\n\t\t\tthis.updateBounds();\n\t\t} else {\n\t\t\tthrow new Error(value + \"should extend me.Renderable\");\n\t\t}\n\t}\n\n\t/** @ignore */\n\tupdate(dt) {\n\t\tif (this.renderable) {\n\t\t\tthis.isDirty |= this.renderable.update(dt);\n\t\t}\n\t\treturn super.update(dt);\n\t}\n\n\t/**\n\t * update the bounding box for this entity.\n\t * @param {boolean} [absolute=true] - update the bounds size and position in (world) absolute coordinates\n\t * @returns {Bounds} this entity bounding box Rectangle object\n\t */\n\tupdateBounds(absolute = true) {\n\t\tconst bounds = this.getBounds();\n\n\t\tbounds.clear();\n\t\tbounds.addFrame(0, 0, this.width, this.height);\n\n\t\t// add each renderable bounds\n\t\tif (this.children && this.children.length > 0) {\n\t\t\tbounds.addBounds(this.children[0].getBounds());\n\t\t}\n\n\t\tif (this.body) {\n\t\t\tbounds.addBounds(this.body.getBounds());\n\t\t}\n\n\t\tif (absolute === true) {\n\t\t\tconst absPos = this.getAbsolutePosition();\n\t\t\tbounds.centerOn(\n\t\t\t\tabsPos.x + bounds.x + bounds.width / 2,\n\t\t\t\tabsPos.y + bounds.y + bounds.height / 2,\n\t\t\t);\n\t\t}\n\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * update the bounds when the body is modified\n\t */\n\tonBodyUpdate() {\n\t\tthis.updateBounds();\n\t}\n\n\tpreDraw(renderer) {\n\t\trenderer.save();\n\n\t\t// translate to the entity position\n\t\trenderer.translate(\n\t\t\tthis.pos.x + this.body.getBounds().x,\n\t\t\tthis.pos.y + this.body.getBounds().y,\n\t\t);\n\n\t\tif (this.renderable instanceof Renderable) {\n\t\t\t// draw the child renderable's anchorPoint at the entity's\n\t\t\t// anchor point. the entity's anchor point is a scale from\n\t\t\t// body position to body width/height\n\t\t\trenderer.translate(\n\t\t\t\tthis.anchorPoint.x * this.body.getBounds().width,\n\t\t\t\tthis.anchorPoint.y * this.body.getBounds().height,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * draw this entity (automatically called by melonJS)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer, viewport) {\n\t\tconst renderable = this.renderable;\n\t\tif (renderable instanceof Renderable) {\n\t\t\t// predraw (apply transforms)\n\t\t\trenderable.preDraw(renderer);\n\n\t\t\t// draw the object\n\t\t\trenderable.draw(renderer, viewport);\n\n\t\t\t// postdraw (clean-up);\n\t\t\trenderable.postDraw(renderer);\n\t\t}\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\t// free some property objects\n\t\tif (this.renderable) {\n\t\t\tthis.renderable.destroy.apply(this.renderable, arguments);\n\t\t\tthis.children.splice(0, 1);\n\t\t}\n\n\t\t// call the parent destroy method\n\t\tsuper.destroy(arguments);\n\t}\n\n\t/**\n\t * onDeactivateEvent Notification function\n\t */\n\tonDeactivateEvent() {\n\t\tif (this.renderable && this.renderable.onDeactivateEvent) {\n\t\t\tthis.renderable.onDeactivateEvent();\n\t\t}\n\t}\n}\n", "import { game } from \"../index.js\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport {\n\teventEmitter,\n\tLEVEL_LOADED,\n\tONCONTEXT_RESTORED,\n\tVIEWPORT_ONCHANGE,\n\tVIEWPORT_ONRESIZE,\n} from \"../system/event.ts\";\nimport * as stringUtil from \"./../utils/string.ts\";\nimport { renderer } from \"./../video/video.js\";\nimport Sprite from \"./sprite.js\";\n\n/**\n * additional import for TypeScript\n * @import {Vector2d} from \"../math/vector2d.js\";\n */\n\n/**\n * a generic Image Layer Object\n */\nexport default class ImageLayer extends Sprite {\n\t/**\n\t * @param {number} x - x coordinate\n\t * @param {number} y - y coordinate\n\t * @param {object} settings - ImageLayer properties\n\t * @param {HTMLImageElement|HTMLCanvasElement|string} settings.image - Image reference. See {@link loader.getImage}\n\t * @param {string} [settings.name=\"me.ImageLayer\"] - layer name\n\t * @param {number} [settings.z=0] - z-index position\n\t * @param {number|Vector2d} [settings.ratio=1.0] - Scrolling ratio to be applied. See {@link ImageLayer#ratio}\n\t * @param {\"repeat\"|\"repeat-x\"|\"repeat-y\"|\"no-repeat\"} [settings.repeat=\"repeat\"] - define if and how an Image Layer should be repeated. See {@link ImageLayer#repeat}\n\t * @param {number|Vector2d} [settings.anchorPoint=<0.0,0.0>] - Define how the image is anchored to the viewport bound. By default, its upper-left corner is anchored to the viewport bounds upper left corner.\n\t * @example\n\t * // create a repetitive background pattern on the X axis using the citycloud image asset\n\t * me.game.world.addChild(new me.ImageLayer(0, 0, {\n\t * image:\"citycloud\",\n\t * repeat :\"repeat-x\"\n\t * }), 1);\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the constructor\n\t\tsuper(x, y, settings);\n\n\t\t// render in screen coordinates\n\t\tthis.floating = true;\n\n\t\t// image drawing offset\n\t\tthis.offset.set(x, y);\n\n\t\t/**\n\t\t * Define the image scrolling ratio<br>\n\t\t * Scrolling speed is defined by multiplying the viewport delta position by the specified ratio.\n\t\t * Setting this vector to &lt;0.0,0.0&gt; will disable automatic scrolling.<br>\n\t\t * To specify a value through Tiled, use one of the following format : <br>\n\t\t * - a number, to change the value for both axis <br>\n\t\t * - a json expression like `json:{\"x\":0.5,\"y\":0.5}` if you wish to specify a different value for both x and y\n\t\t * @type {Vector2d}\n\t\t * @default <1.0,1.0>\n\t\t */\n\t\tthis.ratio = vector2dPool.get(1.0, 1.0);\n\n\t\tif (typeof settings.ratio !== \"undefined\") {\n\t\t\t// little hack for backward compatiblity\n\t\t\tif (stringUtil.isNumeric(settings.ratio)) {\n\t\t\t\tthis.ratio.set(settings.ratio, +settings.ratio);\n\t\t\t} /* vector */ else {\n\t\t\t\tthis.ratio.setV(settings.ratio);\n\t\t\t}\n\t\t}\n\n\t\tif (typeof settings.anchorPoint === \"undefined\") {\n\t\t\tthis.anchorPoint.set(0, 0);\n\t\t} else {\n\t\t\tif (typeof settings.anchorPoint === \"number\") {\n\t\t\t\tthis.anchorPoint.set(settings.anchorPoint, settings.anchorPoint);\n\t\t\t} /* vector */ else {\n\t\t\t\tthis.anchorPoint.set(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t\t}\n\t\t}\n\n\t\tthis.repeat = settings.repeat || \"repeat\";\n\n\t\t// on context lost, all previous textures are destroyed\n\t\tthis.boundCreatePattern = this.createPattern.bind(this);\n\t\teventEmitter.addListener(ONCONTEXT_RESTORED, this.boundCreatePattern);\n\t}\n\n\t/**\n\t * Define if and how an Image Layer should be repeated.<br>\n\t * By default, an Image Layer is repeated both vertically and horizontally.<br>\n\t * Acceptable values : <br>\n\t * - 'repeat' - The background image will be repeated both vertically and horizontally <br>\n\t * - 'repeat-x' - The background image will be repeated only horizontally.<br>\n\t * - 'repeat-y' - The background image will be repeated only vertically.<br>\n\t * - 'no-repeat' - The background-image will not be repeated.<br>\n\t * @type {string}\n\t * @default 'repeat'\n\t */\n\tget repeat() {\n\t\treturn this._repeat;\n\t}\n\n\tset repeat(value) {\n\t\tthis._repeat = value;\n\t\tswitch (this._repeat) {\n\t\t\tcase \"no-repeat\":\n\t\t\t\tthis.repeatX = false;\n\t\t\t\tthis.repeatY = false;\n\t\t\t\tbreak;\n\t\t\tcase \"repeat-x\":\n\t\t\t\tthis.repeatX = true;\n\t\t\t\tthis.repeatY = false;\n\t\t\t\tbreak;\n\t\t\tcase \"repeat-y\":\n\t\t\t\tthis.repeatX = false;\n\t\t\t\tthis.repeatY = true;\n\t\t\t\tbreak;\n\t\t\tdefault: // \"repeat\"\n\t\t\t\tthis.repeatX = true;\n\t\t\t\tthis.repeatY = true;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.resize(game.viewport.width, game.viewport.height);\n\t\tthis.createPattern();\n\t}\n\n\t// called when the layer is added to the game world or a container\n\tonActivateEvent() {\n\t\tthis.boundUpdateLayer = this.updateLayer.bind(this);\n\t\tthis.boundResize = this.resize.bind(this);\n\t\t// register to the viewport change notification\n\t\teventEmitter.addListener(VIEWPORT_ONCHANGE, this.boundUpdateLayer);\n\t\teventEmitter.addListener(VIEWPORT_ONRESIZE, this.boundResize);\n\t\t// force a first refresh when the level is loaded\n\t\teventEmitter.addListener(LEVEL_LOADED, this.boundUpdateLayer);\n\t\t// in case the level is not added to the root container,\n\t\t// the onActivateEvent call happens after the LEVEL_LOADED event\n\t\t// so we need to force a first update\n\t\tif (this.ancestor.root !== true) {\n\t\t\tthis.updateLayer();\n\t\t}\n\t}\n\n\t/**\n\t * resize the Image Layer to match the given size\n\t * @param {number} w - new width\n\t * @param {number} h - new height\n\t */\n\tresize(w, h) {\n\t\treturn super.resize(\n\t\t\tthis.repeatX ? Infinity : w,\n\t\t\tthis.repeatY ? Infinity : h,\n\t\t);\n\t}\n\n\t/**\n\t * createPattern function\n\t * @ignore\n\t */\n\tcreatePattern() {\n\t\tthis._pattern = renderer.createPattern(this.image, this._repeat);\n\t}\n\n\t/**\n\t * updateLayer function\n\t * @ignore\n\t */\n\tupdateLayer() {\n\t\tconst rx = this.ratio.x;\n\t\tconst ry = this.ratio.y;\n\n\t\tconst viewport = game.viewport;\n\n\t\tif (rx === 0 && ry === 0) {\n\t\t\t// static image\n\t\t\treturn;\n\t\t}\n\n\t\tconst width = this.width;\n\t\tconst height = this.height;\n\t\tconst bw = viewport.bounds.width;\n\t\tconst bh = viewport.bounds.height;\n\t\tconst ax = this.anchorPoint.x;\n\t\tconst ay = this.anchorPoint.y;\n\t\t/*\n\t\t * Automatic positioning\n\t\t *\n\t\t * See https://github.com/melonjs/melonJS/issues/741#issuecomment-138431532\n\t\t * for a thorough description of how this works.\n\t\t */\n\t\tconst x =\n\t\t\tax * (rx - 1) * (bw - viewport.width) +\n\t\t\tthis.offset.x -\n\t\t\trx * viewport.pos.x;\n\t\tconst y =\n\t\t\tay * (ry - 1) * (bh - viewport.height) +\n\t\t\tthis.offset.y -\n\t\t\try * viewport.pos.y;\n\n\t\t// Repeat horizontally; start drawing from left boundary\n\t\tif (this.repeatX) {\n\t\t\tthis.pos.x = x % width;\n\t\t} else {\n\t\t\tthis.pos.x = x;\n\t\t}\n\n\t\t// Repeat vertically; start drawing from top boundary\n\t\tif (this.repeatY) {\n\t\t\tthis.pos.y = y % height;\n\t\t} else {\n\t\t\tthis.pos.y = y;\n\t\t}\n\n\t\tthis.isDirty = true;\n\t}\n\n\t/**\n\t * override the default predraw function\n\t * as repeat and anchor are managed directly in the draw method\n\t * @ignore\n\t */\n\tpreDraw(renderer) {\n\t\t// save the context\n\t\trenderer.save();\n\n\t\t// apply the defined alpha value\n\t\trenderer.setGlobalAlpha(renderer.globalAlpha() * this.getOpacity());\n\n\t\t// apply the defined tint, if any\n\t\trenderer.setTint(this.tint);\n\n\t\t// apply blending if different from \"normal\"\n\t\tif (this.blendMode !== renderer.getBlendMode()) {\n\t\t\trenderer.setBlendMode(this.blendMode);\n\t\t}\n\t}\n\n\t/**\n\t * draw this ImageLayer (automatically called by melonJS)\n\t * @protected\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer, viewport) {\n\t\tconst width = this.width;\n\t\tconst height = this.height;\n\t\tconst bw = viewport.bounds.width;\n\t\tconst bh = viewport.bounds.height;\n\t\tconst ax = this.anchorPoint.x;\n\t\tconst ay = this.anchorPoint.y;\n\n\t\tlet x = this.pos.x;\n\t\tlet y = this.pos.y;\n\n\t\tif (this.ratio.x === 0 && this.ratio.y === 0) {\n\t\t\t// static image\n\t\t\tx = x + ax * (bw - width);\n\t\t\ty = y + ay * (bh - height);\n\t\t}\n\n\t\trenderer.translate(x, y);\n\t\trenderer.drawPattern(\n\t\t\tthis._pattern,\n\t\t\t0,\n\t\t\t0,\n\t\t\tviewport.width * 2,\n\t\t\tviewport.height * 2,\n\t\t);\n\t}\n\n\t// called when the layer is removed from the game world or a container\n\tonDeactivateEvent() {\n\t\t// cancel all event subscriptions\n\t\teventEmitter.removeListener(VIEWPORT_ONCHANGE, this.boundUpdateLayer);\n\t\teventEmitter.removeListener(VIEWPORT_ONRESIZE, this.boundResize);\n\t\teventEmitter.removeListener(LEVEL_LOADED, this.boundUpdateLayer);\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tvector2dPool.release(this.ratio);\n\t\tthis.ratio = undefined;\n\t\teventEmitter.removeListener(ONCONTEXT_RESTORED, this.boundCreatePattern);\n\t\tsuper.destroy();\n\t}\n}\n", "import { ellipsePool } from \"./../geometries/ellipse.ts\";\nimport { colorPool } from \"./../math/color.ts\";\nimport pool from \"../system/legacy_pool.js\";\nimport CanvasRenderTarget from \"../video/rendertarget/canvasrendertarget.js\";\nimport Renderable from \"./renderable.js\";\n\n/**\n * additional import for TypeScript\n * @import {Color} from \"./../math/color.ts\";\n * @import {Ellipse} from \"./../geometries/ellipse.ts\";\n * @import CanvasRenderer from \"./../video/canvas/canvas_renderer.js\";\n * @import WebGLRenderer from \"./../video/webgl/webgl_renderer.js\";\n */\n\n/** @ignore */\nfunction createGradient(light) {\n\tconst context = light.texture.context;\n\n\tconst x1 = light.texture.width / 2;\n\tconst y1 = light.texture.height / 2;\n\n\tconst radiusX = light.radiusX;\n\tconst radiusY = light.radiusY;\n\n\tlet scaleX;\n\tlet scaleY;\n\tlet invScaleX;\n\tlet invScaleY;\n\tlet gradient;\n\n\tlight.texture.clear();\n\n\tif (radiusX >= radiusY) {\n\t\tscaleX = 1;\n\t\tinvScaleX = 1;\n\t\tscaleY = radiusY / radiusX;\n\t\tinvScaleY = radiusX / radiusY;\n\t\tgradient = context.createRadialGradient(\n\t\t\tx1,\n\t\t\ty1 * invScaleY,\n\t\t\t0,\n\t\t\tx1,\n\t\t\tradiusY * invScaleY,\n\t\t\tradiusX,\n\t\t);\n\t} else {\n\t\tscaleY = 1;\n\t\tinvScaleY = 1;\n\t\tscaleX = radiusX / radiusY;\n\t\tinvScaleX = radiusY / radiusX;\n\t\tgradient = context.createRadialGradient(\n\t\t\tx1 * invScaleX,\n\t\t\ty1,\n\t\t\t0,\n\t\t\tx1 * invScaleX,\n\t\t\ty1,\n\t\t\tradiusY,\n\t\t);\n\t}\n\n\tgradient.addColorStop(0, light.color.toRGBA(light.intensity));\n\tgradient.addColorStop(1, light.color.toRGBA(0.0));\n\n\tcontext.fillStyle = gradient;\n\n\tcontext.setTransform(scaleX, 0, 0, scaleY, 0, 0);\n\tcontext.fillRect(\n\t\t0,\n\t\t0,\n\t\tlight.texture.width * invScaleX,\n\t\tlight.texture.height * invScaleY,\n\t);\n}\n\n/**\n * A 2D point light.\n * Note: this is a very experimental and work in progress feature, that provides a simple spot light effect.\n * The light effect is best rendered in WebGL, as they are few limitations when using the Canvas Renderer\n * (multiple lights are not supported, alpha component of the ambient light is ignored)\n * @see stage.lights\n */\nexport default class Light2d extends Renderable {\n\t/**\n\t * @param {number} x - The horizontal position of the light.\n\t * @param {number} y - The vertical position of the light.\n\t * @param {number} radiusX - The horizontal radius of the light.\n\t * @param {number} [radiusY=radiusX] - The vertical radius of the light.\n\t * @param {Color|string} [color=\"#FFF\"] - the color of the light\n\t * @param {number} [intensity=0.7] - The intensity of the light.\n\t */\n\tconstructor(\n\t\tx,\n\t\ty,\n\t\tradiusX,\n\t\tradiusY = radiusX,\n\t\tcolor = \"#FFF\",\n\t\tintensity = 0.7,\n\t) {\n\t\t// call the parent constructor\n\t\tsuper(x, y, radiusX * 2, radiusY * 2);\n\n\t\t/**\n\t\t * the color of the light\n\t\t * @type {Color}\n\t\t * @default \"#FFF\"\n\t\t */\n\t\tthis.color = colorPool.get().parseCSS(color);\n\n\t\t/**\n\t\t * The horizontal radius of the light\n\t\t * @type {number}\n\t\t */\n\t\tthis.radiusX = radiusX;\n\n\t\t/**\n\t\t * The vertical radius of the light\n\t\t * @type {number}\n\t\t */\n\t\tthis.radiusY = radiusY;\n\n\t\t/**\n\t\t * The intensity of the light\n\t\t * @type {number}\n\t\t * @default 0.7\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t\t/**\n\t\t * the default blend mode to be applied when rendering this light\n\t\t * @type {string}\n\t\t * @default \"lighter\"\n\t\t * @see CanvasRenderer#setBlendMode\n\t\t * @see WebGLRenderer#setBlendMode\n\t\t */\n\t\tthis.blendMode = \"lighter\";\n\n\t\t/** @ignore */\n\t\tthis.visibleArea = ellipsePool.get(\n\t\t\tthis.centerX,\n\t\t\tthis.centerY,\n\t\t\tthis.width,\n\t\t\tthis.height,\n\t\t);\n\n\t\t/** @ignore */\n\t\tthis.texture = new CanvasRenderTarget(this.width, this.height, {\n\t\t\toffscreenCanvas: false,\n\t\t});\n\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\tcreateGradient(this);\n\t}\n\n\t/**\n\t * returns a geometry representing the visible area of this light\n\t * @returns {Ellipse} the light visible mask\n\t */\n\tgetVisibleArea() {\n\t\treturn this.visibleArea.setShape(\n\t\t\tthis.getBounds().centerX,\n\t\t\tthis.getBounds().centerY,\n\t\t\tthis.width,\n\t\t\tthis.height,\n\t\t);\n\t}\n\n\t/**\n\t * update function\n\t * @param {number} dt - time since the last update in milliseconds.\n\t * @returns {boolean} true if dirty\n\t */\n\tupdate() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * preDraw this Light2d (automatically called by melonJS)\n\t * Note: The renderer should set the blend mode again (after drawing other Light2d objects)\n\t * to ensure colors blend correctly in the CanvasRenderer.\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t */\n\tpreDraw(renderer) {\n\t\tsuper.preDraw(renderer);\n\t\trenderer.setBlendMode(this.blendMode);\n\t}\n\n\t/**\n\t * draw this Light2d (automatically called by melonJS)\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance\n\t * @param {Camera2d} [viewport] - the viewport to (re)draw\n\t */\n\tdraw(renderer) {\n\t\trenderer.drawImage(\n\t\t\tthis.texture.canvas,\n\t\t\tthis.getBounds().x,\n\t\t\tthis.getBounds().y,\n\t\t);\n\t}\n\n\t/**\n\t * Destroy function<br>\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tcolorPool.release(this.color);\n\t\tthis.color = undefined;\n\t\tpool.push(this.texture);\n\t\tthis.texture.destroy();\n\t\tthis.texture = undefined;\n\t\tellipsePool.release(this.visibleArea);\n\t\tthis.visibleArea = undefined;\n\t\tsuper.destroy();\n\t}\n}\n", "import Sprite from \"./sprite.js\";\n\n/**\n * additional import for TypeScript\n * @import {Color} from \"./../math/color.ts\";\n * @import { TextureAtlas } from \"./../video/texture/atlas.js\";\n */\n\n/**\n * A NineSliceSprite is similar to a Sprite, but it uses 9-slice scaling to strech its inner area to fit the size of the Renderable,\n * by proportionally scaling a sprite by splitting it in a grid of nine parts (with only parts 1, 3, 7, 9 not being scaled). <br>\n * <img src=\"images/9-slice-scaling.png\"/><br>\n * @see https://en.wikipedia.org/wiki/9-slice_scaling\n */\nexport default class NineSliceSprite extends Sprite {\n\t/**\n\t * @param {number} x - the x coordinates of the sprite object\n\t * @param {number} y - the y coordinates of the sprite object\n\t * @param {object} settings - Configuration parameters for the Sprite object\n\t * @param {number} settings.width - the width of the Renderable over which the sprite needs to be stretched\n\t * @param {number} settings.height - the height of the Renderable over which the sprite needs to be stretched\n\t * @param {number} [settings.insetx] - the width of a corner over which the sprite is unscaled (default is a quarter of the sprite width)\n\t * @param {number} [settings.insety] - the height of a corner over which the sprite is unscaled (default is a quarter of the sprite height)\n\t * @param {HTMLImageElement|HTMLCanvasElement|TextureAtlas|string} settings.image - reference to spritesheet image, a texture atlas or to a texture atlas\n\t * @param {string} [settings.name=\"\"] - name of this object\n\t * @param {string} [settings.region] - region name of a specific region to use when using a texture atlas, see {@link TextureAtlas}\n\t * @param {number} [settings.framewidth] - Width of a single frame within the spritesheet\n\t * @param {number} [settings.frameheight] - Height of a single frame within the spritesheet\n\t * @param {string|Color} [settings.tint] - a tint to be applied to this sprite\n\t * @param {number} [settings.flipX] - flip the sprite on the horizontal axis\n\t * @param {number} [settings.flipY] - flip the sprite on the vertical axis\n\t * @param {Vector2d} [settings.anchorPoint={x:0.5, y:0.5}] - Anchor point to draw the frame at (defaults to the center of the frame).\n\t * @example\n\t * this.panelSprite = new me.NineSliceSprite(0, 0, {\n\t * image : game.texture,\n\t * region : \"grey_panel\",\n\t * width : this.width,\n\t * height : this.height\n\t * });\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the super constructor\n\t\tsuper(x, y, settings);\n\n\t\t// ensure mandatory properties are defined\n\t\tif (\n\t\t\ttypeof settings.width !== \"number\" ||\n\t\t\ttypeof settings.height !== \"number\"\n\t\t) {\n\t\t\tthrow new Error(\"height and width properties are mandatory\");\n\t\t}\n\n\t\t// adjust the nss sprite size accordingly to the target \"expanded\" size\n\t\tthis.width = Math.floor(settings.width);\n\t\tthis.height = Math.floor(settings.height);\n\n\t\t// nine slice sprite specific internal variables\n\t\tthis.nss_width = this.width;\n\t\tthis.nss_height = this.height;\n\n\t\tthis.insetx = settings.insetx;\n\t\tthis.insety = settings.insety;\n\t}\n\n\t/**\n\t * width of the NineSliceSprite\n\t * @type {number}\n\t */\n\tget width() {\n\t\treturn super.width;\n\t}\n\tset width(value) {\n\t\tsuper.width = this.nss_width = value;\n\t}\n\n\t/**\n\t * height of the NineSliceSprite\n\t * @type {number}\n\t */\n\tget height() {\n\t\treturn super.height;\n\t}\n\tset height(value) {\n\t\tsuper.height = this.nss_height = value;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tdraw(renderer) {\n\t\t// the frame to draw\n\t\tconst frame = this.current;\n\n\t\t// cache the current position and size\n\t\tlet dx = this.pos.x;\n\t\tconst dy = this.pos.y;\n\n\t\tlet w = frame.width;\n\t\tlet h = frame.height;\n\n\t\t// frame offset in the texture/atlas\n\t\tconst frame_offset = frame.offset;\n\t\tconst g_offset = this.offset;\n\n\t\t// remove image's TexturePacker/ShoeBox rotation\n\t\tif (frame.angle !== 0) {\n\t\t\trenderer.translate(-dx, -dy);\n\t\t\trenderer.rotate(frame.angle);\n\t\t\tdx -= h;\n\t\t\tw = frame.height;\n\t\t\th = frame.width;\n\t\t}\n\n\t\tconst sx = g_offset.x + frame_offset.x;\n\t\tconst sy = g_offset.y + frame_offset.y;\n\n\t\t// should this be configurable ?\n\t\tconst corner_width = this.insetx || w / 4;\n\t\tconst corner_height = this.insety || h / 4;\n\n\t\t// OPTIMIZE ME !\n\n\t\t// DRAW CORNERS\n\n\t\t// Top Left\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx, // sx\n\t\t\tsy, // sy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // sw,sh\n\t\t\tdx,\n\t\t\tdy, // dx,dy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // dw,dh\n\t\t);\n\n\t\t// Top Right\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + w - corner_width, // sx\n\t\t\tsy, // sy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // sw,sh\n\t\t\tdx + this.nss_width - corner_width, // dx\n\t\t\tdy, // dy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // dw,dh\n\t\t);\n\t\t// Bottom Left\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx, // sx\n\t\t\tsy + h - corner_height, // sy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // sw,sh\n\t\t\tdx, // dx\n\t\t\tdy + this.nss_height - corner_height, // dy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // dw,dh\n\t\t);\n\t\t// Bottom Right\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + w - corner_width, // sx\n\t\t\tsy + h - corner_height, // sy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // sw,sh\n\t\t\tdx + this.nss_width - corner_width, //dx\n\t\t\tdy + this.nss_height - corner_height, // dy\n\t\t\tcorner_width,\n\t\t\tcorner_height, // dw,dh\n\t\t);\n\n\t\t// DRAW SIDES and CENTER\n\t\tconst image_center_width = w - (corner_width << 1);\n\t\tconst image_center_height = h - (corner_height << 1);\n\n\t\tconst target_center_width = this.nss_width - (corner_width << 1);\n\t\tconst target_center_height = this.nss_height - (corner_height << 1);\n\n\t\t//Top center\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + corner_width, // sx\n\t\t\tsy, // sy\n\t\t\timage_center_width, // sw\n\t\t\tcorner_height, // sh\n\t\t\tdx + corner_width, // dx\n\t\t\tdy, // dy\n\t\t\ttarget_center_width, // dw\n\t\t\tcorner_height, // dh\n\t\t);\n\n\t\t//Bottom center\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + corner_width, // sx\n\t\t\tsy + h - corner_height, // sy\n\t\t\timage_center_width, // sw\n\t\t\tcorner_height, // sh\n\t\t\tdx + corner_width, // dx\n\t\t\tdy + this.nss_height - corner_height, // dx\n\t\t\ttarget_center_width, // dw\n\t\t\tcorner_height, // dh\n\t\t);\n\n\t\t// Middle Left\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx, // sx\n\t\t\tsy + corner_height, // sy\n\t\t\tcorner_width, // sw\n\t\t\timage_center_height, // sh\n\t\t\tdx, // dx\n\t\t\tdy + corner_height, // dy\n\t\t\tcorner_width, // dw\n\t\t\ttarget_center_height, // dh\n\t\t);\n\n\t\t// Middle Right\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + w - corner_width, // sx\n\t\t\tsy + corner_height, // sy\n\t\t\tcorner_width, // sw\n\t\t\timage_center_height, // sh\n\t\t\tdx + this.nss_width - corner_width, // dx\n\t\t\tdy + corner_height, // dy\n\t\t\tcorner_width, // dw\n\t\t\ttarget_center_height, // dh\n\t\t);\n\n\t\t// Middle Center\n\t\trenderer.drawImage(\n\t\t\tthis.image,\n\t\t\tsx + corner_width, // sx\n\t\t\tsy + corner_height, // sy\n\t\t\timage_center_width, // sw\n\t\t\timage_center_height, // sh\n\t\t\tdx + corner_width, // dx\n\t\t\tdy + corner_height, // dy\n\t\t\ttarget_center_width, // dw\n\t\t\ttarget_center_height, // dh\n\t\t);\n\t}\n}\n", "/**\n * apply the current text style to the given context\n * @ignore\n */\nexport default function setContextStyle(context, style) {\n\tcontext.font = style.font;\n\tcontext.fillStyle = style.fillStyle.toRGBA();\n\tcontext.strokeStyle = style.strokeStyle.toRGBA();\n\tcontext.lineWidth = style.lineWidth;\n\tcontext.textAlign = style.textAlign;\n\tcontext.textBaseline = style.textBaseline;\n}\n", "import { Color, colorPool } from \"../../math/color.ts\";\nimport { nextPowerOfTwo } from \"../../math/math.ts\";\nimport pool from \"../../system/legacy_pool.js\";\nimport CanvasRenderTarget from \"../../video/rendertarget/canvasrendertarget.js\";\nimport { renderer as globalRenderer } from \"../../video/video.js\";\nimport Renderable from \"../renderable.js\";\nimport TextMetrics from \"./textmetrics.js\";\nimport setContextStyle from \"./textstyle.js\";\n\n/*\n * ASCII Table\n * http://www.asciitable.com/\n * [ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz]\n *\n * -> first char \" \" 32d (0x20);\n */\n\nconst runits = [\"ex\", \"em\", \"pt\", \"px\"];\nconst toPX = [12, 24, 0.75, 1];\n\n/**\n * a generic system font object.\n */\nexport default class Text extends Renderable {\n\t/**\n\t * @param {number} x - position of the text object\n\t * @param {number} y - position of the text object\n\t * @param {object} settings - the text configuration\n\t * @param {string} settings.font - a CSS family font name\n\t * @param {number|string} settings.size - size, or size + suffix (px, em, pt)\n\t * @param {Color|string} [settings.fillStyle=\"#000000\"] - a CSS color value\n\t * @param {Color|string} [settings.strokeStyle=\"#000000\"] - a CSS color value\n\t * @param {number} [settings.lineWidth=0] - line width, in pixels, when drawing stroke\n\t * @param {string} [settings.textAlign=\"left\"] - horizontal text alignment\n\t * @param {string} [settings.textBaseline=\"top\"] - the text baseline\n\t * @param {number} [settings.lineHeight=1.0] - line spacing height\n\t * @param {Vector2d} [settings.anchorPoint={x:0.0, y:0.0}] - anchor point to draw the text at\n\t * @param {number} [settings.wordWrapWidth] - the maximum length in CSS pixel for a single segment of text\n\t * @param {(string|string[])} [settings.text=\"\"] - a string, or an array of strings\n\t * @example\n\t * let font = new me.Text(0, 0, {font: \"Arial\", size: 8, fillStyle: this.color});\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the parent constructor\n\t\tsuper(x, y, settings.width || 0, settings.height || 0);\n\n\t\t/**\n\t\t * defines the color used to draw the font.\n\t\t * @type {Color}\n\t\t * @default black\n\t\t */\n\t\tthis.fillStyle = colorPool.get(0, 0, 0);\n\n\t\t/**\n\t\t * defines the color used to draw the font stroke.<br>\n\t\t * @type {Color}\n\t\t * @default black\n\t\t */\n\t\tthis.strokeStyle = colorPool.get(0, 0, 0);\n\n\t\t/**\n\t\t * sets the current line width, in pixels, when drawing stroke\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.lineWidth = 0;\n\n\t\t/**\n\t\t * Set the default text alignment (or justification),<br>\n\t\t * possible values are \"left\", \"right\", and \"center\".<br>\n\t\t * @type {string}\n\t\t * @default \"left\"\n\t\t */\n\t\tthis.textAlign = \"left\";\n\n\t\t/**\n\t\t * Set the text baseline (e.g. the Y-coordinate for the draw operation), <br>\n\t\t * possible values are \"top\", \"hanging, \"middle, \"alphabetic, \"ideographic, \"bottom\"<br>\n\t\t * @type {string}\n\t\t * @default \"top\"\n\t\t */\n\t\tthis.textBaseline = \"top\";\n\n\t\t/**\n\t\t * Set the line spacing height (when displaying multi-line strings). <br>\n\t\t * Current font height will be multiplied with this value to set the line height.\n\t\t * @type {number}\n\t\t * @default 1.0\n\t\t */\n\t\tthis.lineHeight = 1.0;\n\n\t\t/**\n\t\t * the maximum length in CSS pixel for a single segment of text.\n\t\t * (use -1 to disable word wrapping)\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.wordWrapWidth = -1;\n\n\t\t/**\n\t\t * the font size (in px)\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.fontSize = 10;\n\n\t\t/**\n\t\t * the text to be displayed\n\t\t * @private\n\t\t */\n\t\tthis._text = [];\n\n\t\t// initalize the object based on the given settings\n\t\tthis.onResetEvent(x, y, settings);\n\t}\n\n\t/** @ignore */\n\tonResetEvent(x, y, settings) {\n\t\tif (typeof this.fillStyle === \"undefined\") {\n\t\t\tthis.fillStyle = colorPool.get(0, 0, 0);\n\t\t}\n\n\t\tif (typeof this.strokeStyle === \"undefined\") {\n\t\t\tthis.strokeStyle = colorPool.get(0, 0, 0);\n\t\t}\n\n\t\tif (typeof settings.fillStyle !== \"undefined\") {\n\t\t\tif (settings.fillStyle instanceof Color) {\n\t\t\t\tthis.fillStyle.copy(settings.fillStyle);\n\t\t\t} else {\n\t\t\t\t// string (#RGB, #ARGB, #RRGGBB, #AARRGGBB)\n\t\t\t\tthis.fillStyle.parseCSS(settings.fillStyle);\n\t\t\t}\n\t\t}\n\n\t\tif (typeof settings.strokeStyle !== \"undefined\") {\n\t\t\tif (settings.strokeStyle instanceof Color) {\n\t\t\t\tthis.strokeStyle.copy(settings.strokeStyle);\n\t\t\t} else {\n\t\t\t\t// string (#RGB, #ARGB, #RRGGBB, #AARRGGBB)\n\t\t\t\tthis.strokeStyle.parseCSS(settings.strokeStyle);\n\t\t\t}\n\t\t}\n\n\t\tthis.lineWidth = settings.lineWidth || 0;\n\t\tthis.textAlign = settings.textAlign || \"left\";\n\t\tthis.textBaseline = settings.textBaseline || \"top\";\n\t\tthis.lineHeight = settings.lineHeight || 1.0;\n\t\tthis.wordWrapWidth = settings.wordWrapWidth || -1;\n\t\tthis.fontSize = 10;\n\n\t\t// anchor point\n\t\tif (typeof settings.anchorPoint !== \"undefined\") {\n\t\t\tthis.anchorPoint.set(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t} else {\n\t\t\tthis.anchorPoint.set(0, 0);\n\t\t}\n\n\t\t// if floating was specified through settings\n\t\tif (typeof settings.floating !== \"undefined\") {\n\t\t\tthis.floating = !!settings.floating;\n\t\t}\n\n\t\t// font name and type\n\t\tthis.setFont(settings.font, settings.size);\n\n\t\t// aditional\n\t\tif (settings.bold === true) {\n\t\t\tthis.bold();\n\t\t}\n\t\tif (settings.italic === true) {\n\t\t\tthis.italic();\n\t\t}\n\n\t\t// the canvas Texture used to render this text\n\t\t// XXX: offscreenCanvas is currently disabled for text rendering due to issue in WebGL mode\n\t\tthis.canvasTexture = new CanvasRenderTarget(2, 2, {\n\t\t\toffscreenCanvas: false,\n\t\t});\n\n\t\t// instance to text metrics functions\n\t\tthis.metrics = new TextMetrics(this);\n\n\t\t// set the text\n\t\tthis.setText(settings.text);\n\t}\n\n\t/**\n\t * make the font bold\n\t * @returns {Text} this object for chaining\n\t */\n\tbold() {\n\t\tthis.font = \"bold \" + this.font;\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * make the font italic\n\t * @returns {Text} this object for chaining\n\t */\n\titalic() {\n\t\tthis.font = \"italic \" + this.font;\n\t\tthis.isDirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * set the font family and size\n\t * @param {string} font - a CSS font name\n\t * @param {number|string} [size=10] - size in px, or size + suffix (px, em, pt)\n\t * @returns {Text} this object for chaining\n\t * @example\n\t * font.setFont(\"Arial\", 20);\n\t * font.setFont(\"Arial\", \"1.5em\");\n\t */\n\tsetFont(font, size = 10) {\n\t\t// font name and type\n\t\tconst font_names = font.split(\",\").map((value) => {\n\t\t\tvalue = value.trim();\n\t\t\treturn !/(^\".*\"$)|(^'.*'$)/.test(value) ? '\"' + value + '\"' : value;\n\t\t});\n\n\t\t// font size\n\t\tif (typeof size === \"number\") {\n\t\t\tthis.fontSize = size;\n\t\t\tsize += \"px\";\n\t\t} /* string */ else {\n\t\t\t// extract the units and convert if necessary\n\t\t\tconst CSSval = size.match(/([-+]?[\\d.]*)(.*)/);\n\t\t\tthis.fontSize = parseFloat(CSSval[1]);\n\t\t\tif (CSSval[2]) {\n\t\t\t\tthis.fontSize *= toPX[runits.indexOf(CSSval[2])];\n\t\t\t} else {\n\t\t\t\t// no unit define, assume px\n\t\t\t\tsize += \"px\";\n\t\t\t}\n\t\t}\n\t\tthis.height = this.fontSize;\n\t\tthis.font = size + \" \" + font_names.join(\",\");\n\n\t\tthis.isDirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the text to be displayed\n\t * @param {number|string|string[]} value - a string, or an array of strings\n\t * @returns {Text} this object for chaining\n\t */\n\tsetText(value = \"\") {\n\t\tconst bounds = this.getBounds();\n\n\t\t// set the next text\n\t\tif (this._text.toString() !== value.toString()) {\n\t\t\tif (!Array.isArray(value)) {\n\t\t\t\tthis._text = (\"\" + value).split(\"\\n\");\n\t\t\t} else {\n\t\t\t\tthis._text = value;\n\t\t\t}\n\t\t}\n\n\t\t// word wrap if necessary\n\t\tif (this._text.length > 0 && this.wordWrapWidth > 0) {\n\t\t\tthis._text = this.metrics.wordWrap(\n\t\t\t\tthis._text,\n\t\t\t\tthis.wordWrapWidth,\n\t\t\t\tthis.canvasTexture.context,\n\t\t\t);\n\t\t}\n\n\t\t// calculcate the text size and update the bounds accordingly\n\t\tbounds.addBounds(\n\t\t\tthis.metrics.measureText(this._text, this.canvasTexture.context),\n\t\t\ttrue,\n\t\t);\n\n\t\t// update the offScreenCanvas texture if required\n\t\tlet width = Math.ceil(this.metrics.width);\n\t\tlet height = Math.ceil(this.metrics.height);\n\n\t\tif (globalRenderer.WebGLVersion === 1) {\n\t\t\t// round size to next Pow2\n\t\t\twidth = nextPowerOfTwo(this.metrics.width);\n\t\t\theight = nextPowerOfTwo(this.metrics.height);\n\t\t}\n\n\t\t// invalidate the texture\n\t\tthis.canvasTexture.invalidate(globalRenderer);\n\n\t\t// resize the cache canvas if necessary\n\t\tif (\n\t\t\tthis.canvasTexture.width < width ||\n\t\t\tthis.canvasTexture.height < height\n\t\t) {\n\t\t\tthis.canvasTexture.resize(width, height);\n\t\t}\n\n\t\tthis.canvasTexture.clear();\n\t\tthis._drawFont(\n\t\t\tthis.canvasTexture.context,\n\t\t\tthis._text,\n\t\t\tthis.pos.x - this.metrics.x,\n\t\t\tthis.pos.y - this.metrics.y,\n\t\t);\n\n\t\tthis.isDirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * measure the given text size in pixels\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - reference to the active renderer\n\t * @param {string} [text] - the text to be measured\n\t * @returns {TextMetrics} a TextMetrics object defining the dimensions of the given piece of text\n\t */\n\tmeasureText(renderer, text = this._text) {\n\t\treturn this.metrics.measureText(text, this.canvasTexture.context);\n\t}\n\n\t/**\n\t * draw a text at the specified coord\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - Reference to the destination renderer instance\n\t * @param {string} [text]\n\t * @param {number} [x]\n\t * @param {number} [y]\n\t */\n\tdraw(renderer, text, x = this.pos.x, y = this.pos.y) {\n\t\t// \"hacky patch\" for backward compatibilty\n\t\tif (typeof this.ancestor === \"undefined\") {\n\t\t\t// update position if changed\n\t\t\tif (this.pos.x !== x || this.pos.y !== y) {\n\t\t\t\tthis.pos.x = x;\n\t\t\t\tthis.pos.y = y;\n\t\t\t\tthis.isDirty = true;\n\t\t\t}\n\n\t\t\t// update text cache\n\t\t\tthis.setText(text);\n\n\t\t\t// save the previous context\n\t\t\trenderer.save();\n\n\t\t\t// apply the defined alpha value\n\t\t\trenderer.setGlobalAlpha(renderer.globalAlpha() * this.getOpacity());\n\t\t}\n\n\t\t// adjust x,y position based on the bounding box\n\t\tx = this.metrics.x;\n\t\ty = this.metrics.y;\n\n\t\t// clamp to pixel grid if required\n\t\tif (renderer.settings.subPixel === false) {\n\t\t\tx = ~~x;\n\t\t\ty = ~~y;\n\t\t}\n\n\t\t// draw the text\n\t\trenderer.drawImage(this.canvasTexture.canvas, x, y);\n\n\t\t// for backward compatibilty\n\t\tif (typeof this.ancestor === \"undefined\") {\n\t\t\t// restore previous context\n\t\t\trenderer.restore();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t_drawFont(context, text, x, y) {\n\t\tsetContextStyle(context, this);\n\n\t\tfor (let i = 0; i < text.length; i++) {\n\t\t\tconst string = text[i].trimEnd();\n\t\t\t// draw the string\n\t\t\tif (this.fillStyle.alpha > 0) {\n\t\t\t\tcontext.fillText(string, x, y);\n\t\t\t}\n\t\t\t// stroke the text\n\t\t\tif (this.lineWidth > 0 && this.strokeStyle.alpha > 0) {\n\t\t\t\tcontext.strokeText(string, x, y);\n\t\t\t}\n\t\t\t// add leading space\n\t\t\ty += this.metrics.lineHeight();\n\t\t}\n\t\treturn this.metrics;\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tif (typeof globalRenderer.gl !== \"undefined\") {\n\t\t\t// make sure the right compositor is active\n\t\t\tglobalRenderer.setCompositor(\"quad\");\n\t\t\tglobalRenderer.currentCompositor.deleteTexture2D(\n\t\t\t\tglobalRenderer.currentCompositor.getTexture2D(this.glTextureUnit),\n\t\t\t);\n\t\t\tthis.glTextureUnit = undefined;\n\t\t}\n\t\tglobalRenderer.cache.delete(this.canvasTexture.canvas);\n\t\tpool.push(this.canvasTexture);\n\t\tthis.canvasTexture.destroy();\n\t\tthis.canvasTexture = undefined;\n\t\tcolorPool.release(this.fillStyle);\n\t\tcolorPool.release(this.strokeStyle);\n\t\tthis.fillStyle = this.strokeStyle = undefined;\n\t\tthis.metrics = undefined;\n\t\tthis._text.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n", "import { Bounds } from \"../../physics/bounds.ts\";\nimport Text from \"./text.js\";\nimport setContextStyle from \"./textstyle.js\";\n\n/**\n * a Text Metrics object that contains helper for text manipulation\n */\nclass TextMetrics extends Bounds {\n\t/**\n\t * @param {Text|BitmapText} ancestor - the parent object that contains this TextMetrics object\n\t */\n\tconstructor(ancestor) {\n\t\t// parent constructor\n\t\tsuper();\n\n\t\t/**\n\t\t * a reference to the parent object that contains this TextMetrics object\n\t\t * @type {Renderable}\n\t\t * @default undefined\n\t\t */\n\t\tthis.ancestor = ancestor;\n\n\t\tthis.setMinMax(0, 0, 0, 0);\n\t}\n\n\t/**\n\t * Returns the height of a segment of inline text in CSS pixels.\n\t * @returns {number} the height of a segment of inline text in CSS pixels.\n\t */\n\tlineHeight() {\n\t\tif (this.ancestor instanceof Text) {\n\t\t\treturn this.ancestor.fontSize * this.ancestor.lineHeight;\n\t\t} else {\n\t\t\t// it's a BitmapText\n\t\t\treturn (\n\t\t\t\tthis.ancestor.fontData.capHeight *\n\t\t\t\tthis.ancestor.lineHeight *\n\t\t\t\tthis.ancestor.fontScale.y\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the width of the given segment of inline text in CSS pixels.\n\t * @param {string} text - the text to be measured\n\t * @param {CanvasRenderingContext2D} [context] - reference to an active 2d context for canvas rendering\n\t * @returns {number} the width of the given segment of inline text in CSS pixels.\n\t */\n\tlineWidth(text, context) {\n\t\tif (this.ancestor instanceof Text) {\n\t\t\treturn context.measureText(text).width;\n\t\t} else {\n\t\t\t// it's a BitmapText\n\t\t\tconst characters = text.split(\"\");\n\t\t\tconst charactersLength = characters.length;\n\t\t\tlet width = 0;\n\t\t\tlet lastGlyph = null;\n\t\t\tfor (let i = 0; i < charactersLength; i++) {\n\t\t\t\tconst ch = characters[i].charCodeAt(0);\n\t\t\t\tconst glyph = this.ancestor.fontData.glyphs[ch];\n\t\t\t\tif (typeof glyph !== \"undefined\") {\n\t\t\t\t\tconst kerning =\n\t\t\t\t\t\tlastGlyph && lastGlyph.kerning ? lastGlyph.getKerning(ch) : 0;\n\t\t\t\t\twidth += (glyph.xadvance + kerning) * this.ancestor.fontScale.x;\n\t\t\t\t\tlastGlyph = glyph;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn width;\n\t\t}\n\t}\n\n\t/**\n\t * measure the given text size in CSS pixels\n\t * @param {string} text - the text to be measured\n\t * @param {CanvasRenderingContext2D} [context] - reference to an active 2d context for canvas rendering\n\t * @returns {TextMetrics} this\n\t */\n\tmeasureText(text, context) {\n\t\tlet strings;\n\n\t\tif (!Array.isArray(text)) {\n\t\t\tstrings = (\"\" + text).split(\"\\n\");\n\t\t} else {\n\t\t\tstrings = text;\n\t\t}\n\n\t\tif (typeof context !== \"undefined\") {\n\t\t\t// save the previous context\n\t\t\tcontext.save();\n\n\t\t\t// apply the style font\n\t\t\tsetContextStyle(context, this.ancestor);\n\t\t}\n\n\t\t// compute the bounding box size\n\t\tthis.width = this.height = 0;\n\n\t\tfor (let i = 0; i < strings.length; i++) {\n\t\t\tthis.width = Math.max(\n\t\t\t\tthis.lineWidth(strings[i].trimEnd(), context),\n\t\t\t\tthis.width,\n\t\t\t);\n\t\t\tthis.height += this.lineHeight();\n\t\t}\n\t\tthis.width = Math.ceil(this.width);\n\t\tthis.height = Math.ceil(this.height);\n\n\t\t// compute the bounding box position\n\t\tthis.x = Math.floor(\n\t\t\tthis.ancestor.textAlign === \"right\"\n\t\t\t\t? this.ancestor.pos.x - this.width\n\t\t\t\t: this.ancestor.textAlign === \"center\"\n\t\t\t\t\t? this.ancestor.pos.x - this.width / 2\n\t\t\t\t\t: this.ancestor.pos.x,\n\t\t);\n\t\tthis.y = Math.floor(\n\t\t\tthis.ancestor.textBaseline.search(/^(top|hanging)$/) === 0\n\t\t\t\t? this.ancestor.pos.y\n\t\t\t\t: this.ancestor.textBaseline === \"middle\"\n\t\t\t\t\t? this.ancestor.pos.y - this.lineHeight() / 2\n\t\t\t\t\t: this.ancestor.pos.y - this.lineHeight(),\n\t\t);\n\n\t\tif (typeof context !== \"undefined\") {\n\t\t\t// restore the context\n\t\t\tcontext.restore();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * wrap the given text based on the given width\n\t * @param {string|string[]} text - the text to be wrapped\n\t * @param {number} width - maximum width of one segment of text in css pixel\n\t * @param {CanvasRenderingContext2D} [context] - reference to an active 2d context for canvas rendering\n\t * @returns {string[]} an array of string representing wrapped text\n\t */\n\twordWrap(text, width, context) {\n\t\tlet currentLine = \"\";\n\t\tconst output = [];\n\n\t\tif (Array.isArray(text)) {\n\t\t\t// join into a single string\n\t\t\ttext = text.join(\" \");\n\t\t}\n\t\t// word splitting to be improved as it replaces \\n by space if present\n\t\tconst words = text.replace(/[\\r\\n]+/g, \" \").split(\" \");\n\n\t\tif (typeof context !== \"undefined\") {\n\t\t\t// save the previous context\n\t\t\tcontext.save();\n\n\t\t\t// apply the style font\n\t\t\tsetContextStyle(context, this.ancestor);\n\t\t}\n\n\t\tfor (let i = 0; i < words.length; i++) {\n\t\t\tconst word = words[i];\n\t\t\tconst lineWidth = this.lineWidth(currentLine + word + \" \", context);\n\t\t\tif (lineWidth < width) {\n\t\t\t\t// add the word to the current line\n\t\t\t\tcurrentLine += word + \" \";\n\t\t\t} else {\n\t\t\t\toutput.push(currentLine + \"\\n\");\n\t\t\t\tcurrentLine = word + \" \";\n\t\t\t}\n\t\t}\n\t\t// last line\n\t\toutput.push(currentLine);\n\n\t\tif (typeof context !== \"undefined\") {\n\t\t\t// restore the context\n\t\t\tcontext.restore();\n\t\t}\n\n\t\treturn output;\n\t}\n}\nexport default TextMetrics;\n", "import { getBinary, getImage } from \"../../loader/loader.js\";\nimport { Color } from \"../../math/color.ts\";\nimport { vector2dPool } from \"../../math/vector2d.ts\";\nimport Renderable from \"../renderable.js\";\nimport { bitmapTextDataPool } from \"./bitmaptextdata.ts\";\nimport TextMetrics from \"./textmetrics.js\";\n\n/**\n * a bitmap font object\n */\nexport default class BitmapText extends Renderable {\n\t/**\n\t * @param {number} x - position of the text object\n\t * @param {number} y - position of the text object\n\t * @param {object} settings - the text configuration\n\t * @param {string|Image} settings.font - a font name to identify the corresponing source image\n\t * @param {string} [settings.fontData=settings.font] - the bitmap font data corresponding name, or the bitmap font data itself\n\t * @param {number} [settings.size] - size a scaling ratio\n\t * @param {Color|string} [settings.fillStyle] - a CSS color value used to tint the bitmapText (@see BitmapText.tint)\n\t * @param {number} [settings.lineWidth=1] - line width, in pixels, when drawing stroke\n\t * @param {string} [settings.textAlign=\"left\"] - horizontal text alignment\n\t * @param {string} [settings.textBaseline=\"top\"] - the text baseline\n\t * @param {number} [settings.lineHeight=1.0] - line spacing height\n\t * @param {Vector2d} [settings.anchorPoint={x:0.0, y:0.0}] - anchor point to draw the text at\n\t * @param {number} [settings.wordWrapWidth] - the maximum length in CSS pixel for a single segment of text\n\t * @param {(string|string[])} [settings.text] - a string, or an array of strings\n\t * @example\n\t * // Use me.loader.preload or me.loader.load to load assets\n\t * me.loader.preload([\n\t * { name: \"arial\", type: \"binary\" src: \"data/font/arial.fnt\" },\n\t * { name: \"arial\", type: \"image\" src: \"data/font/arial.png\" },\n\t * ])\n\t * // Then create an instance of your bitmap font:\n\t * let myFont = new me.BitmapText(x, y, {font:\"arial\", text:\"Hello\"});\n\t * // two possibilities for using \"myFont\"\n\t * // either call the draw function from your Renderable draw function\n\t * myFont.draw(renderer, \"Hello!\", 0, 0);\n\t * // or just add it to the word container\n\t * me.game.world.addChild(myFont);\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the parent constructor\n\t\tsuper(x, y, settings.width || 0, settings.height || 0);\n\n\t\t/**\n\t\t * Set the default text alignment (or justification),<br>\n\t\t * possible values are \"left\", \"right\", and \"center\".\n\t\t * @public\n\t\t * @type {string}\n\t\t * @default \"left\"\n\t\t */\n\t\tthis.textAlign = settings.textAlign || \"left\";\n\n\t\t/**\n\t\t * Set the text baseline (e.g. the Y-coordinate for the draw operation), <br>\n\t\t * possible values are \"top\", \"hanging, \"middle, \"alphabetic, \"ideographic, \"bottom\"<br>\n\t\t * @public\n\t\t * @type {string}\n\t\t * @default \"top\"\n\t\t */\n\t\tthis.textBaseline = settings.textBaseline || \"top\";\n\n\t\t/**\n\t\t * Set the line spacing height (when displaying multi-line strings). <br>\n\t\t * Current font height will be multiplied with this value to set the line height.\n\t\t * @public\n\t\t * @type {number}\n\t\t * @default 1.0\n\t\t */\n\t\tthis.lineHeight = settings.lineHeight || 1.0;\n\n\t\t/**\n\t\t * the maximum length in CSS pixel for a single segment of text.\n\t\t * (use -1 to disable word wrapping)\n\t\t * @public\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.wordWrapWidth = settings.wordWrapWidth || -1;\n\n\t\t/**\n\t\t * the text to be displayed\n\t\t * @private\n\t\t */\n\t\tthis._text = [];\n\n\t\t/**\n\t\t * scaled font size\n\t\t * @private\n\t\t */\n\t\tthis.fontScale = vector2dPool.get(1.0, 1.0);\n\n\t\t/**\n\t\t * font image\n\t\t * @private\n\t\t */\n\t\tthis.fontImage =\n\t\t\ttypeof settings.font === \"object\"\n\t\t\t\t? settings.font\n\t\t\t\t: getImage(settings.font);\n\n\t\tif (typeof settings.fontData !== \"string\") {\n\t\t\t/**\n\t\t\t * font data\n\t\t\t * @private\n\t\t\t */\n\t\t\t// use settings.font to retreive the data from the loader\n\t\t\tthis.fontData = bitmapTextDataPool.get(getBinary(settings.font));\n\t\t} else {\n\t\t\tthis.fontData = bitmapTextDataPool.get(\n\t\t\t\t// if starting/includes \"info face\" the whole data string was passed as parameter\n\t\t\t\tsettings.fontData.includes(\"info face\")\n\t\t\t\t\t? settings.fontData\n\t\t\t\t\t: getBinary(settings.fontData),\n\t\t\t);\n\t\t}\n\n\t\t// if floating was specified through settings\n\t\tif (typeof settings.floating !== \"undefined\") {\n\t\t\tthis.floating = !!settings.floating;\n\t\t}\n\n\t\t// apply given fillstyle\n\t\tif (typeof settings.fillStyle !== \"undefined\") {\n\t\t\tthis.fillStyle = settings.fillStyle;\n\t\t}\n\n\t\t// update anchorPoint if provided\n\t\tif (typeof settings.anchorPoint !== \"undefined\") {\n\t\t\tthis.anchorPoint.set(settings.anchorPoint.x, settings.anchorPoint.y);\n\t\t} else {\n\t\t\tthis.anchorPoint.set(0, 0);\n\t\t}\n\n\t\t// instance to text metrics functions\n\t\tthis.metrics = new TextMetrics(this);\n\n\t\t// resize if necessary\n\t\tif (typeof settings.size === \"number\" && settings.size !== 1.0) {\n\t\t\tthis.resize(settings.size);\n\t\t}\n\n\t\t// set the text\n\t\tthis.setText(settings.text);\n\t}\n\n\t/**\n\t * change the font settings\n\t * @param {string} textAlign - (\"left\", \"center\", \"right\")\n\t * @param {number} [scale]\n\t * @returns {BitmapText} this object for chaining\n\t */\n\tset(textAlign, scale) {\n\t\tthis.textAlign = textAlign;\n\t\t// updated scaled Size\n\t\tif (scale) {\n\t\t\tthis.resize(scale);\n\t\t}\n\t\tthis.isDirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * change the text to be displayed\n\t * @param {number|string|string[]} value - a string, or an array of strings\n\t * @returns {BitmapText} this object for chaining\n\t */\n\tsetText(value = \"\") {\n\t\tif (this._text.toString() !== value.toString()) {\n\t\t\tif (!Array.isArray(value)) {\n\t\t\t\tthis._text = (\"\" + value).split(\"\\n\");\n\t\t\t} else {\n\t\t\t\tthis._text = value;\n\t\t\t}\n\t\t\tthis.isDirty = true;\n\t\t}\n\n\t\tif (this._text.length > 0 && this.wordWrapWidth > 0) {\n\t\t\tthis._text = this.metrics.wordWrap(this._text, this.wordWrapWidth);\n\t\t}\n\n\t\tthis.updateBounds();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * update the bounding box for this Bitmap Text.\n\t * @param {boolean} [absolute=true] - update the bounds size and position in (world) absolute coordinates\n\t * @returns {Bounds} this Bitmap Text bounding box Rectangle object\n\t */\n\tupdateBounds(absolute = true) {\n\t\tconst bounds = this.getBounds();\n\n\t\tbounds.clear();\n\n\t\tif (typeof this.metrics !== \"undefined\") {\n\t\t\tlet ax;\n\t\t\tlet ay;\n\n\t\t\tbounds.addBounds(this.metrics.measureText(this._text));\n\n\t\t\tswitch (this.textAlign) {\n\t\t\t\tcase \"right\":\n\t\t\t\t\tax = this.metrics.width * 1.0;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"center\":\n\t\t\t\t\tax = this.metrics.width * 0.5;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tax = 0; //this.metrics.width * 0.0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// adjust y pos based on alignment value\n\t\t\tswitch (this.textBaseline) {\n\t\t\t\tcase \"middle\":\n\t\t\t\t\tay = this.metrics.height * 0.5;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ideographic\":\n\t\t\t\tcase \"alphabetic\":\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tay = this.metrics.height * 1.0;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tay = 0; //this.metrics.height * 0.0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// translate the bounds accordingly\n\t\t\tbounds.translate(ax, ay);\n\t\t}\n\n\t\tif (absolute === true) {\n\t\t\tif (\n\t\t\t\ttypeof this.ancestor !== \"undefined\" &&\n\t\t\t\ttypeof this.ancestor.getAbsolutePosition === \"function\" &&\n\t\t\t\tthis.floating !== true\n\t\t\t) {\n\t\t\t\tbounds.translate(this.ancestor.getAbsolutePosition());\n\t\t\t}\n\t\t}\n\n\t\treturn bounds;\n\t}\n\n\t/**\n\t * defines the color used to tint the bitmap text\n\t * @public\n\t * @type {Color}\n\t * @see Renderable#tint\n\t */\n\tget fillStyle() {\n\t\treturn this.tint;\n\t}\n\tset fillStyle(value) {\n\t\tif (value instanceof Color) {\n\t\t\tthis.tint.copy(value);\n\t\t} else {\n\t\t\t// string (#RGB, #ARGB, #RRGGBB, #AARRGGBB)\n\t\t\tthis.tint.parseCSS(value);\n\t\t}\n\t}\n\n\t/**\n\t * change the font display size\n\t * @param {number} scale - ratio\n\t * @returns {BitmapText} this object for chaining\n\t */\n\tresize(scale) {\n\t\tthis.fontScale.set(scale, scale);\n\n\t\tthis.updateBounds();\n\n\t\tthis.isDirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * measure the given text size in pixels\n\t * @param {string} [text]\n\t * @returns {TextMetrics} a TextMetrics object with two properties: `width` and `height`, defining the output dimensions\n\t */\n\tmeasureText(text = this._text) {\n\t\treturn this.metrics.measureText(text);\n\t}\n\n\t/**\n\t * draw the bitmap font\n\t * @param {CanvasRenderer|WebGLRenderer} renderer - Reference to the destination renderer instance\n\t * @param {string} [text]\n\t * @param {number} [x]\n\t * @param {number} [y]\n\t */\n\tdraw(renderer, text, x, y) {\n\t\t// save the previous global alpha value\n\t\tconst _alpha = renderer.globalAlpha();\n\n\t\t// allows to provide backward compatibility when\n\t\t// adding Bitmap Font to an object container\n\t\tif (typeof this.ancestor === \"undefined\") {\n\t\t\t// update cache\n\t\t\tthis.setText(text);\n\t\t\trenderer.setGlobalAlpha(_alpha * this.getOpacity());\n\t\t} else {\n\t\t\t// added directly to an object container\n\t\t\tx = this.pos.x;\n\t\t\ty = this.pos.y;\n\t\t}\n\n\t\tconst lX = x;\n\t\tconst stringHeight = this.metrics.lineHeight();\n\t\tlet maxWidth = 0;\n\n\t\tfor (let i = 0; i < this._text.length; i++) {\n\t\t\tx = lX;\n\t\t\tconst string = this._text[i].trimEnd();\n\t\t\t// adjust x pos based on alignment value\n\t\t\tconst stringWidth = this.metrics.lineWidth(string);\n\t\t\tswitch (this.textAlign) {\n\t\t\t\tcase \"right\":\n\t\t\t\t\tx -= stringWidth;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"center\":\n\t\t\t\t\tx -= stringWidth * 0.5;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// adjust y pos based on alignment value\n\t\t\tswitch (this.textBaseline) {\n\t\t\t\tcase \"middle\":\n\t\t\t\t\ty -= stringHeight * 0.5;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ideographic\":\n\t\t\t\tcase \"alphabetic\":\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\ty -= stringHeight;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// update initial position if required\n\t\t\tif (this.isDirty === true && typeof this.ancestor === \"undefined\") {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tthis.pos.y = y;\n\t\t\t\t}\n\t\t\t\tif (maxWidth < stringWidth) {\n\t\t\t\t\tmaxWidth = stringWidth;\n\t\t\t\t\tthis.pos.x = x;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// draw the string\n\t\t\tlet lastGlyph = null;\n\t\t\tfor (let c = 0, len = string.length; c < len; c++) {\n\t\t\t\t// calculate the char index\n\t\t\t\tconst ch = string.charCodeAt(c);\n\t\t\t\tconst glyph = this.fontData.glyphs[ch];\n\n\t\t\t\tif (typeof glyph !== \"undefined\") {\n\t\t\t\t\tconst glyphWidth = glyph.width;\n\t\t\t\t\tconst glyphHeight = glyph.height;\n\t\t\t\t\tconst kerning =\n\t\t\t\t\t\tlastGlyph && lastGlyph.kerning ? lastGlyph.getKerning(ch) : 0;\n\t\t\t\t\tconst scaleX = this.fontScale.x;\n\t\t\t\t\tconst scaleY = this.fontScale.y;\n\n\t\t\t\t\t// draw it\n\t\t\t\t\tif (glyphWidth !== 0 && glyphHeight !== 0) {\n\t\t\t\t\t\t// some browser throw an exception when drawing a 0 width or height image\n\t\t\t\t\t\trenderer.drawImage(\n\t\t\t\t\t\t\tthis.fontImage,\n\t\t\t\t\t\t\tglyph.x,\n\t\t\t\t\t\t\tglyph.y,\n\t\t\t\t\t\t\tglyphWidth,\n\t\t\t\t\t\t\tglyphHeight,\n\t\t\t\t\t\t\tx + glyph.xoffset * scaleX,\n\t\t\t\t\t\t\ty + glyph.yoffset * scaleY,\n\t\t\t\t\t\t\tglyphWidth * scaleX,\n\t\t\t\t\t\t\tglyphHeight * scaleY,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// increment position\n\t\t\t\t\tx += (glyph.xadvance + kerning) * scaleX;\n\t\t\t\t\tlastGlyph = glyph;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"BitmapText: no defined Glyph in for \" + String.fromCharCode(ch),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// increment line\n\t\t\ty += stringHeight;\n\t\t}\n\n\t\tif (typeof this.ancestor === \"undefined\") {\n\t\t\t// restore the previous global alpha value\n\t\t\trenderer.setGlobalAlpha(_alpha);\n\t\t}\n\n\t\t// clear the dirty flag here for\n\t\t// backward compatibility\n\t\tthis.isDirty = false;\n\t}\n\n\t/**\n\t * Destroy function\n\t * @ignore\n\t */\n\tdestroy() {\n\t\tvector2dPool.release(this.fontScale);\n\t\tthis.fontScale = undefined;\n\t\tbitmapTextDataPool.release(this.fontData);\n\t\tthis.fontData = undefined;\n\t\tthis._text.length = 0;\n\t\tthis.metrics = undefined;\n\t\tsuper.destroy();\n\t}\n}\n", "import { polygonPool } from \"../geometries/polygon.ts\";\nimport { level } from \"./../level/level.js\";\nimport { vector2dPool } from \"../math/vector2d.ts\";\nimport Body from \"./../physics/body.js\";\nimport { collision } from \"./../physics/collision.js\";\nimport Renderable from \"./renderable.js\";\n\n/**\n * additional import for TypeScript\n * @import ResponseObject from \"./../physics/response.js\";\n */\n\n/**\n * trigger an event when colliding with another object\n */\nexport default class Trigger extends Renderable {\n\t/**\n\t * @param {number} x - the x coordinates of the trigger area\n\t * @param {number} y - the y coordinates of the trigger area\n\t * @param {Object} settings - trigger settings\n\t * @param {number} [settings.width] - width of the trigger area\n\t * @param {number} [settings.height] - height of the trigger area\n\t * @param {Rect[]|Polygon[]|Line[]|Ellipse[]} [settings.shapes] - collision shape(s) that will trigger the event\n\t * @param {string} [settings.duration] - Fade duration (in ms)\n\t * @param {string|Color} [settings.color] - Fade color\n\t * @param {string} [settings.event=\"level\"] - the type of event to trigger (only \"level\" supported for now)\n\t * @param {string} [settings.to] - level to load if level trigger\n\t * @param {string|Container} [settings.container] - Target container. See {@link level.load}\n\t * @param {Function} [settings.onLoaded] - Level loaded callback. See {@link level.load}\n\t * @param {boolean} [settings.flatten] - Flatten all objects into the target container. See {@link level.load}\n\t * @param {boolean} [settings.setViewportBounds] - Resize the viewport to match the level. See {@link level.load}\n\t * @example\n\t * world.addChild(new me.Trigger(\n\t * x, y, {\n\t * shapes: [new me.Rect(0, 0, 100, 100)],\n\t * \"duration\" : 250,\n\t * \"color\" : \"#000\",\n\t * \"to\" : \"mymap2\"\n\t * }\n\t * ));\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the parent constructor\n\t\tsuper(x, y, settings.width || 0, settings.height || 0);\n\n\t\t// for backward compatibility\n\t\tthis.anchorPoint.set(0, 0);\n\n\t\tthis.fade = settings.fade;\n\t\tthis.duration = settings.duration;\n\t\tthis.fading = false;\n\n\t\t// Tiled Settings\n\t\tthis.name = \"Trigger\";\n\t\tthis.type = settings.type;\n\t\tthis.id = settings.id;\n\n\t\t// a temp variable\n\t\tthis.gotolevel = settings.to;\n\n\t\t// Collect the defined trigger settings\n\t\tthis.triggerSettings = {\n\t\t\t// the default (and only for now) action\n\t\t\tevent: \"level\",\n\t\t};\n\n\t\t[\n\t\t\t\"type\",\n\t\t\t\"container\",\n\t\t\t\"onLoaded\",\n\t\t\t\"flatten\",\n\t\t\t\"setViewportBounds\",\n\t\t\t\"to\",\n\t\t].forEach((property) => {\n\t\t\tif (typeof settings[property] !== \"undefined\") {\n\t\t\t\tthis.triggerSettings[property] = settings[property];\n\t\t\t}\n\t\t});\n\n\t\t// add and configure the physic body\n\t\tlet shape = settings.shapes;\n\t\tif (typeof shape === \"undefined\") {\n\t\t\tshape = polygonPool.get(0, 0, [\n\t\t\t\tvector2dPool.get(0, 0),\n\t\t\t\tvector2dPool.get(this.width, 0),\n\t\t\t\tvector2dPool.get(this.width, this.height),\n\t\t\t]);\n\t\t}\n\t\tthis.body = new Body(this, shape);\n\t\tthis.body.collisionType = collision.types.ACTION_OBJECT;\n\t\t// by default only collides with PLAYER_OBJECT\n\t\tthis.body.setCollisionMask(collision.types.PLAYER_OBJECT);\n\t\tthis.body.setStatic(true);\n\t\tthis.resize(this.body.getBounds().width, this.body.getBounds().height);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tgetTriggerSettings() {\n\t\tconst world = this.ancestor.getRootAncestor();\n\t\t// Lookup for the container instance\n\t\tif (typeof this.triggerSettings.container === \"string\") {\n\t\t\tthis.triggerSettings.container = world.getChildByName(\n\t\t\t\tthis.triggerSettings.container,\n\t\t\t)[0];\n\t\t}\n\t\treturn this.triggerSettings;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonFadeComplete() {\n\t\tconst world = this.ancestor.getRootAncestor();\n\t\tlevel.load(this.gotolevel, this.getTriggerSettings());\n\t\tworld.app.viewport.fadeOut(this.fade, this.duration);\n\t}\n\n\t/**\n\t * trigger this event\n\t * @protected\n\t */\n\ttriggerEvent() {\n\t\tconst triggerSettings = this.getTriggerSettings();\n\t\tconst world = this.ancestor.getRootAncestor();\n\n\t\tif (triggerSettings.event === \"level\") {\n\t\t\tthis.gotolevel = triggerSettings.to;\n\t\t\t// load a level\n\t\t\t//console.log(\"going to : \", to);\n\t\t\tif (this.fade && this.duration) {\n\t\t\t\tif (!this.fading) {\n\t\t\t\t\tthis.fading = true;\n\t\t\t\t\tworld.app.viewport.fadeIn(this.fade, this.duration, () => {\n\t\t\t\t\t\treturn this.onFadeComplete();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel.load(this.gotolevel, triggerSettings);\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"Trigger invalid type\");\n\t\t}\n\t}\n\n\t/**\n\t * onCollision callback, triggered in case of collision with this trigger\n\t * @param {ResponseObject} response - the collision response object\n\t * @param {Renderable} other - the other renderable touching this one (a reference to response.a or response.b)\n\t * @returns {boolean} true if the object should respond to the collision (its position and velocity will be corrected)\n\t */\n\tonCollision() {\n\t\tif (this.name === \"Trigger\") {\n\t\t\tthis.triggerEvent.apply(this);\n\t\t}\n\t\treturn false;\n\t}\n}\n", "import {\n\tregisterPointerEvent,\n\treleasePointerEvent,\n} from \"./../../input/input.js\";\nimport { vector2dPool } from \"../../math/vector2d.ts\";\nimport { eventEmitter, POINTERMOVE } from \"../../system/event.ts\";\nimport timer from \"../../system/timer.ts\";\nimport Container from \"../container.js\";\n\n/**\n * This is a basic clickable and draggable container which you can use in your game UI.\n * Use this for example if you want to display a panel that contains text, images or other UI elements.\n */\nexport default class UIBaseElement extends Container {\n\t#boundPointerMoveHandler;\n\n\t/**\n\t * UI base elements use screen coordinates by default\n\t * (Note: any child elements added to a UIBaseElement should have their floating property to false)\n\t * @see Renderable.floating\n\t * @type {boolean}\n\t * @default true\n\t */\n\tfloating = true;\n\n\t/**\n\t *\n\t * @param {number} x - The x position of the container\n\t * @param {number} y - The y position of the container\n\t * @param {number} w - width of the container\n\t * @param {number} h - height of the container\n\t */\n\tconstructor(x, y, w, h) {\n\t\tsuper(x, y, w, h);\n\t\t/**\n\t\t * object can be clicked or not\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.isClickable = true;\n\n\t\t/**\n\t\t * object can be clicked or not\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isDraggable = false;\n\n\t\t/**\n\t\t * Tap and hold threshold timeout in ms\n\t\t * @type {number}\n\t\t * @default 250\n\t\t */\n\t\tthis.holdThreshold = 250;\n\n\t\t/**\n\t\t * object can be tap and hold\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isHoldable = false;\n\n\t\t/**\n\t\t * true if the pointer is over the object\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.hover = false;\n\n\t\t/**\n\t\t * false if the pointer is down, or true when the pointer status is up\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.released = true;\n\n\t\t// object has been updated (clicked,etc..)\n\t\tthis.holdTimeout = -1;\n\n\t\t// enable event detection\n\t\tthis.isKinematic = false;\n\n\t\t// update container and children bounds automatically\n\t\tthis.enableChildBoundsUpdate = true;\n\n\t\tthis.#boundPointerMoveHandler = this.pointerMove.bind(this);\n\t}\n\n\t/**\n\t * function callback for the pointerdown event\n\t * @ignore\n\t */\n\tclicked(event) {\n\t\t// Check if left mouse button is pressed\n\t\tif (event.button === 0 && this.isClickable) {\n\t\t\tthis.isDirty = true;\n\t\t\tthis.released = false;\n\t\t\tif (this.isHoldable) {\n\t\t\t\ttimer.clearTimer(this.holdTimeout);\n\t\t\t\tthis.holdTimeout = timer.setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\treturn this.hold();\n\t\t\t\t\t},\n\t\t\t\t\tthis.holdThreshold,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tthis.released = false;\n\t\t\t}\n\t\t\tif (this.isDraggable) {\n\t\t\t\tthis.grabOffset.set(event.gameX, event.gameY);\n\t\t\t\tthis.grabOffset.sub(this.pos);\n\t\t\t}\n\t\t\treturn this.onClick(event);\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed (to be extended)\n\t * @param {Pointer} event - the event object\n\t * @returns {boolean} return false if we need to stop propagating the event\n\t */\n\tonClick() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * function callback for the pointerEnter event\n\t * @ignore\n\t */\n\tenter(event) {\n\t\tthis.hover = true;\n\t\tthis.isDirty = true;\n\t\tif (this.isDraggable === true) {\n\t\t\teventEmitter.addListener(POINTERMOVE, this.#boundPointerMoveHandler);\n\t\t\t// to memorize where we grab the object\n\t\t\tthis.grabOffset = vector2dPool.get(0, 0);\n\t\t}\n\t\treturn this.onOver(event);\n\t}\n\n\t/**\n\t * pointermove function\n\t * @ignore\n\t */\n\tpointerMove(event) {\n\t\tif (this.hover === true && this.released === false) {\n\t\t\t// follow the pointer\n\t\t\tthis.pos.set(event.gameX, event.gameY, this.pos.z);\n\t\t\tthis.pos.sub(this.grabOffset);\n\t\t\t// mark the container for redraw\n\t\t\tthis.isDirty = true;\n\t\t\treturn this.onMove(event);\n\t\t}\n\t}\n\n\t/**\n\t * function called when the pointer is moved over the object\n\t * @param {Pointer} event - the event object\n\t */\n\tonMove() {\n\t\t// to be extended\n\t}\n\n\t/**\n\t * function called when the pointer is over the object\n\t * @param {Pointer} event - the event object\n\t */\n\tonOver() {\n\t\t// to be extended\n\t}\n\n\t/**\n\t * function callback for the pointerLeave event\n\t * @ignore\n\t */\n\tleave(event) {\n\t\tthis.hover = false;\n\t\tthis.isDirty = true;\n\t\tif (this.isDraggable === true) {\n\t\t\t// unregister on the global pointermove event\n\t\t\teventEmitter.removeListener(POINTERMOVE, this.#boundPointerMoveHandler);\n\t\t\tvector2dPool.release(this.grabOffset);\n\t\t\tthis.grabOffset = undefined;\n\t\t}\n\t\tthis.release(event);\n\t\treturn this.onOut(event);\n\t}\n\n\t/**\n\t * function called when the pointer is leaving the object area\n\t * @param {Pointer} event - the event object\n\t */\n\tonOut() {\n\t\t// to be extended\n\t}\n\n\t/**\n\t * function callback for the pointerup event\n\t * @ignore\n\t */\n\trelease(event) {\n\t\tif (this.released === false) {\n\t\t\tthis.released = true;\n\t\t\tthis.isDirty = true;\n\t\t\ttimer.clearTimer(this.holdTimeout);\n\t\t\tthis.holdTimeout = -1;\n\t\t\treturn this.onRelease(event);\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed and released (to be extended)\n\t * @returns {boolean} return false if we need to stop propagating the event\n\t */\n\tonRelease() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * function callback for the tap and hold timer event\n\t * @ignore\n\t */\n\thold() {\n\t\ttimer.clearTimer(this.holdTimeout);\n\t\tthis.holdTimeout = -1;\n\t\tthis.isDirty = true;\n\t\tif (!this.released) {\n\t\t\tthis.onHold();\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed and held<br>\n\t * to be extended <br>\n\t */\n\tonHold() {}\n\n\t/**\n\t * function called when added to the game world or a container\n\t * @ignore\n\t */\n\tonActivateEvent() {\n\t\t// register pointer events\n\t\tregisterPointerEvent(\"pointerdown\", this, (e) => {\n\t\t\treturn this.clicked(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerup\", this, (e) => {\n\t\t\treturn this.release(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointercancel\", this, (e) => {\n\t\t\treturn this.release(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerenter\", this, (e) => {\n\t\t\treturn this.enter(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerleave\", this, (e) => {\n\t\t\treturn this.leave(e);\n\t\t});\n\n\t\t// call the parent function\n\t\tsuper.onActivateEvent();\n\t}\n\n\t/**\n\t * function called when removed from the game world or a container\n\t * @ignore\n\t */\n\tonDeactivateEvent() {\n\t\t// release pointer events\n\t\treleasePointerEvent(\"pointerdown\", this);\n\t\treleasePointerEvent(\"pointerup\", this);\n\t\treleasePointerEvent(\"pointercancel\", this);\n\t\treleasePointerEvent(\"pointerenter\", this);\n\t\treleasePointerEvent(\"pointerleave\", this);\n\t\ttimer.clearTimer(this.holdTimeout);\n\t\tthis.holdTimeout = -1;\n\n\t\t// unregister on the global pointermove event\n\t\t// note: this is just a precaution, in case\n\t\t// the object is being remove from his parent\n\t\t// container before the leave function is called\n\t\tif (this.isDraggable === true) {\n\t\t\teventEmitter.removeListener(POINTERMOVE, this.#boundPointerMoveHandler);\n\t\t\tif (typeof this.grabOffset !== \"undefined\") {\n\t\t\t\tvector2dPool.release(this.grabOffset);\n\t\t\t\tthis.grabOffset = undefined;\n\t\t\t}\n\t\t}\n\n\t\t// call the parent function\n\t\tsuper.onDeactivateEvent();\n\t}\n}\n", "import {\n\tregisterPointerEvent,\n\treleasePointerEvent,\n} from \"./../../input/input.js\";\nimport timer from \"./../../system/timer.ts\";\nimport Sprite from \"./../sprite.js\";\n\n/**\n * This is a basic sprite based button which you can use in your Game UI.\n */\nexport default class UISpriteElement extends Sprite {\n\t/**\n\t * if this UISpriteElement should use screen coordinates or local coordinates\n\t * (Note: any UISpriteElement elements added to a floating parent container should have their floating property to false)\n\t * @see Renderable.floating\n\t * @type {boolean}\n\t * @default true\n\t */\n\tfloating = true;\n\n\t/**\n\t * @param {number} x - the x coordinate of the UISpriteElement Object\n\t * @param {number} y - the y coordinate of the UISpriteElement Object\n\t * @param {object} settings - See {@link Sprite}\n\t * @example\n\t * // create a basic GUI Object\n\t * class myButton extends UISpriteElement {\n\t * constructor(x, y) {\n\t * // call the UISpriteElement parent constructor\n\t * super(x, y, {\n\t * image: \"button\",\n\t * framewidth: 100,\n\t * frameheight: 50\n\t * });\n\t * }\n\t *\n\t * // output something in the console\n\t * // when the object is clicked\n\t * onClick(event) {\n\t * console.log(\"clicked!\");\n\t * // don't propagate the event\n\t * return false;\n\t * }\n\t * });\n\t *\n\t * // add the object at pos (10,10)\n\t * world.addChild(new myButton(10,10));\n\t */\n\tconstructor(x, y, settings) {\n\t\t// call the parent constructor\n\t\tsuper(x, y, settings);\n\n\t\t/**\n\t\t * object can be clicked or not\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.isClickable = true;\n\n\t\t/**\n\t\t * Tap and hold threshold timeout in ms\n\t\t * @type {number}\n\t\t * @default 250\n\t\t */\n\t\tthis.holdThreshold = 250;\n\n\t\t/**\n\t\t * object can be tap and hold\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isHoldable = false;\n\n\t\t/**\n\t\t * true if the pointer is over the object\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.hover = false;\n\n\t\t// object has been updated (clicked,etc..)\n\t\tthis.holdTimeout = -1;\n\t\tthis.released = true;\n\n\t\t// enable event detection\n\t\tthis.isKinematic = false;\n\t}\n\n\t/**\n\t * function callback for the pointerdown event\n\t * @ignore\n\t */\n\tclicked(event) {\n\t\t// Check if left mouse button is pressed\n\t\tif (event.button === 0 && this.isClickable) {\n\t\t\tthis.isDirty = true;\n\t\t\tthis.released = false;\n\t\t\tif (this.isHoldable) {\n\t\t\t\ttimer.clearTimer(this.holdTimeout);\n\t\t\t\tthis.holdTimeout = timer.setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\treturn this.hold();\n\t\t\t\t\t},\n\t\t\t\t\tthis.holdThreshold,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tthis.released = false;\n\t\t\t}\n\t\t\treturn this.onClick(event);\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed (to be extended)\n\t * @returns {boolean} return false if we need to stop propagating the event\n\t */\n\tonClick() {\n\t\treturn false;\n\t}\n\n\t/**\n\t * function callback for the pointerEnter event\n\t * @ignore\n\t */\n\tenter(event) {\n\t\tthis.hover = true;\n\t\tthis.isDirty = true;\n\t\treturn this.onOver(event);\n\t}\n\n\t/**\n\t * function called when the pointer is over the object\n\t * @param {Pointer} event - the event object\n\t */\n\tonOver() {\n\t\t// to be extended\n\t}\n\n\t/**\n\t * function callback for the pointerLeave event\n\t * @ignore\n\t */\n\tleave(event) {\n\t\tthis.hover = false;\n\t\tthis.isDirty = true;\n\t\tthis.release(event);\n\t\treturn this.onOut(event);\n\t}\n\n\t/**\n\t * function called when the pointer is leaving the object area\n\t * @param {Pointer} event - the event object\n\t */\n\tonOut() {\n\t\t// to be extended\n\t}\n\n\t/**\n\t * function callback for the pointerup event\n\t * @ignore\n\t */\n\trelease(event) {\n\t\tif (this.released === false) {\n\t\t\tthis.released = true;\n\t\t\tthis.isDirty = true;\n\t\t\ttimer.clearTimer(this.holdTimeout);\n\t\t\tthis.holdTimeout = -1;\n\t\t\treturn this.onRelease(event);\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed and released (to be extended)\n\t * @returns {boolean} return false if we need to stop propagating the event\n\t */\n\tonRelease() {\n\t\treturn false;\n\t}\n\n\t/**\n\t * function callback for the tap and hold timer event\n\t * @ignore\n\t */\n\thold() {\n\t\ttimer.clearTimer(this.holdTimeout);\n\t\tthis.holdTimeout = -1;\n\t\tthis.isDirty = true;\n\t\tif (!this.released) {\n\t\t\tthis.onHold();\n\t\t}\n\t}\n\n\t/**\n\t * function called when the object is pressed and held<br>\n\t * to be extended <br>\n\t */\n\tonHold() {}\n\n\t/**\n\t * function called when added to the game world or a container\n\t * @ignore\n\t */\n\tonActivateEvent() {\n\t\t// register pointer events\n\t\tregisterPointerEvent(\"pointerdown\", this, (e) => {\n\t\t\treturn this.clicked(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerup\", this, (e) => {\n\t\t\treturn this.release(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointercancel\", this, (e) => {\n\t\t\treturn this.release(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerenter\", this, (e) => {\n\t\t\treturn this.enter(e);\n\t\t});\n\t\tregisterPointerEvent(\"pointerleave\", this, (e) => {\n\t\t\treturn this.leave(e);\n\t\t});\n\t}\n\n\t/**\n\t * function called when removed from the game world or a container\n\t * @ignore\n\t */\n\tonDeactivateEvent() {\n\t\t// release pointer events\n\t\treleasePointerEvent(\"pointerdown\", this);\n\t\treleasePointerEvent(\"pointerup\", this);\n\t\treleasePointerEvent(\"pointercancel\", this);\n\t\treleasePointerEvent(\"pointerenter\", this);\n\t\treleasePointerEvent(\"pointerleave\", this);\n\t\ttimer.clearTimer(this.holdTimeout);\n\t\tthis.holdTimeout = -1;\n\t}\n}\n", "import { RoundRect } from \"../../geometries/roundrect.ts\";\nimport BitmapText from \"../text/bitmaptext.js\";\nimport UIBaseElement from \"./uibaseelement.js\";\n\n/**\n * This is a basic base text button which you can use in your Game UI.\n */\nexport default class UITextButton extends UIBaseElement {\n\t/**\n\t * A Bitmap Text Button with an outlined background border, filled with background color.\n\t * It uses a RoundRect as background and changes the background color on hovering over.\n\t * The background will be drawn with 0.5 opacity, so that the background of the button is\n\t * slightly shining through.\n\t * @param {number} x - x pos of the button\n\t * @param {number} y - y pos of the button\n\t * @param {Object} settings - settings object\n\t * @param {string} [settings.font] - The name of the BitmapText font to use\n\t * @param {number} [settings.size=1] - The scale factor of the BitmapText\n\t * @param {string} [settings.text] - The text to display\n\t * @param {string} [settings.bindKey] - The key to bind the action to (default: none)\n\t * @param {string} [settings.hoverOffColor=\"#00aa0080\"] - The css value of a color to be used if the pointer is not hovering over the button\n\t * @param {string} [settings.hoverOnColor=\"#00ff00ff\"] - The css value of a color to be used if the pointer hovers over the button\n\t * @param {string} [settings.borderStrokeColor=\"#000000\"] - The css value of a color to be used to draw the border\n\t * @param {string} [settings.fillStyle] - The css value of a tint color to be used to tint the BitmapText\n\t * @param {string} [settings.textAlign=\"center\"] - horizontal text alignment\n\t * @param {string} [settings.textBaseline=\"middle\"] - the text baseline\n\t * @param {number} [settings.borderWidth] - Width of the button\n\t * @param {number} [settings.borderHeight] - Height of the button\n\t * @example\n\t * // Create a new Button\n\t * class PlayButton extends UITextButton {\n\t * constructor(x,y) {\n\t * super(x,y, {\n\t * font: 'my-font',\n\t * text: 'Play',\n\t * // if you omit the next two, size is calculated by the size of the text\n\t * borderWidth: 200,\n\t * borderHeight: 20,\n\t * backgroundColor: '#00aa0080',\n\t * hoverColor: '#00ff00ff'\n\t * });\n\t * }\n\t *\n\t * onClick(){\n\t * state.change(state.PLAY);\n\t * }\n\t * }\n\t *\n\t * world.addChild(new PlayButton(15,200));\n\t */\n\tconstructor(x, y, settings) {\n\t\tsuper(x, y);\n\n\t\t/**\n\t\t * The key to bind the action to\n\t\t * @type {string}\n\t\t */\n\t\tthis.bindKey = settings.bindKey || -1;\n\n\t\t/**\n\t\t * The css value of a color to be used if the pointer is nothovering over the button\n\t\t * @type {string}\n\t\t */\n\t\t// keep settings.backgroundColor for backward compatibility\n\t\tthis.hoverOffColor =\n\t\t\tsettings.hoverOffColor || settings.backgroundColor || \"#00aa0080\";\n\n\t\t/**\n\t\t * The css value of a color to be used if the pointer hovers over the button\n\t\t * @type {string}\n\t\t */\n\t\t// keep settings.hoverColor for backward compatibility\n\t\tthis.hoverOnColor =\n\t\t\tsettings.hoverOnColor || settings.hoverColor || \"#00ff00ff\";\n\n\t\t/**\n\t\t * The css value of a color to be used to draw the border\n\t\t * @type {string}\n\t\t */\n\t\tthis.borderStrokeColor = settings.borderStrokeColor || \"#000000\";\n\n\t\t/**\n\t\t * Set the default text alignment (or justification),<br>\n\t\t * possible values are \"left\", \"right\", and \"center\".\n\t\t * @public\n\t\t * @type {string}\n\t\t * @default \"center\"\n\t\t */\n\t\tthis.textAlign = settings.textAlign = settings.textAlign || \"center\";\n\n\t\t/**\n\t\t * Set the text baseline (e.g. the Y-coordinate for the draw operation), <br>\n\t\t * possible values are \"top\", \"hanging, \"middle, \"alphabetic, \"ideographic, \"bottom\"<br>\n\t\t * @public\n\t\t * @type {string}\n\t\t * @default \"middle\"\n\t\t */\n\t\tthis.textBaseline = settings.textBaseline =\n\t\t\tsettings.textBaseline || \"middle\";\n\n\t\t/**\n\t\t * the bitmapText used by the UITextButton class\n\t\t * @type {BitmapText}\n\t\t */\n\t\tthis.bitmapText = new BitmapText(0, 0, settings);\n\n\t\t// \"detect\" the button size\n\t\tthis.dimensions = this.bitmapText.measureText();\n\t\tsettings.borderWidth = settings.borderWidth || this.dimensions.width + 16;\n\t\tsettings.borderHeight =\n\t\t\tsettings.borderHeight || this.dimensions.height + 16;\n\n\t\t// create the round rect button\n\t\tthis.border = new RoundRect(\n\t\t\tx,\n\t\t\ty,\n\t\t\tsettings.borderWidth,\n\t\t\tsettings.borderHeight,\n\t\t);\n\n\t\t// resize the container accordingly\n\t\tthis.resize(this.border.getBounds().width, this.border.getBounds().height);\n\n\t\t// adjust size position\n\t\tthis.bitmapText.pos.set(this.width / 2, this.height / 2);\n\n\t\t// add bitmapText to the UI container\n\t\tthis.addChild(this.bitmapText);\n\t}\n\n\tdraw(renderer) {\n\t\tif (this.hover === true) {\n\t\t\trenderer.setColor(this.hoverOnColor);\n\t\t} else {\n\t\t\trenderer.setColor(this.hoverOffColor);\n\t\t}\n\t\trenderer.fill(this.border);\n\t\trenderer.setColor(this.borderStrokeColor);\n\t\trenderer.stroke(this.border);\n\t\tsuper.draw(renderer);\n\t}\n}\n", "import { TupleToUnion } from \"type-fest\";\nimport { createPool } from \"../system/pool.ts\";\nimport { Vector2d } from \"./vector2d.ts\";\n\nconst propertiesToObserve = [\"x\", \"y\"] as const;\ntype ObservableProperty = keyof Pick<\n\tVector2d,\n\tTupleToUnion<typeof propertiesToObserve>\n>;\nconst setOfProperties = new Set<ObservableProperty>(propertiesToObserve);\n\nconst isObservableProperty = (\n\tproperty: string | symbol,\n): property is ObservableProperty => {\n\treturn setOfProperties.has(property as any);\n};\n\n/**\n * Represents a point in a 3D coordinate vector that can be observed for changes.\n */\nexport class ObservableVector2d {\n\tprivate _callback: () => void;\n\tprivate _vector2d: Vector2d;\n\tprivate _revoke: () => void;\n\n\tprivate callBackEnabled: boolean = true;\n\n\t/**\n\t * Creates a new ObservableVector3d instance.\n\t * @param x - The x-coordinate of the vector. Default is 0.\n\t * @param y - The y-coordinate of the vector. Default is 0.\n\t * @param callback - The callback function to be called when the point changes. Default is undefined.\n\t */\n\tconstructor(x: number = 0, y: number = 0, callback?: () => void) {\n\t\tconst { proxy, revoke } = Proxy.revocable(new Vector2d(x, y), {\n\t\t\tset: (target, property, value) => {\n\t\t\t\tif (isObservableProperty(property)) {\n\t\t\t\t\tReflect.set(target, property, value);\n\t\t\t\t\tif (this.callBackEnabled) {\n\t\t\t\t\t\tthis._callback?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t});\n\n\t\tthis._revoke = revoke;\n\t\tthis._vector2d = proxy;\n\n\t\tif (callback) {\n\t\t\tthis.setCallback(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tset(x = 0, y = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._vector2d.x = x;\n\t\tthis._vector2d.y = y;\n\t\tthis._callback?.();\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the x and y coordinates of the point without triggering the callback.\n\t * @param x - The new x-coordinate value.\n\t * @param y - The new y-coordinate value.\n\t * @returns Reference to this object for method chaining.\n\t */\n\tsetMuted(x = 0, y = 0) {\n\t\tthis.callBackEnabled = false;\n\t\tthis._vector2d.x = x;\n\t\tthis._vector2d.y = y;\n\t\tthis.callBackEnabled = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the x-coordinate of the point.\n\t */\n\tget x() {\n\t\treturn this._vector2d.x;\n\t}\n\n\t/**\n\t * Sets the x-coordinate of the point.\n\t * @param value - The new x-coordinate value.\n\t */\n\tset x(value: number) {\n\t\tthis._vector2d.x = value;\n\t}\n\n\t/**\n\t * Gets the y-coordinate of the point.\n\t */\n\tget y() {\n\t\treturn this._vector2d.y;\n\t}\n\n\t/**\n\t * Sets the y-coordinate of the point.\n\t * @param value - The new y-coordinate value.\n\t */\n\tset y(value: number) {\n\t\tthis._vector2d.y = value;\n\t}\n\n\t/**\n\t * Sets the callback function to be called when the point changes.\n\t * @param callback - The callback function.\n\t */\n\tsetCallback(callback: () => void) {\n\t\tthis._callback = callback;\n\t}\n\n\t/**\n\t * set the Vector x and y properties to 0\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetZero() {\n\t\treturn this.set(0, 0);\n\t}\n\n\t/**\n\t * set the Vector x and y properties using the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsetV(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(v.x, v.y);\n\t}\n\n\t/**\n\t * Add the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tadd(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(this.x + v.x, this.y + v.y);\n\t}\n\n\t/**\n\t * Substract the passed vector to this vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tsub(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(this.x - v.x, this.y - v.y);\n\t}\n\n\t/**\n\t * Multiply this vector values by the given scalar\n\t * @param x x scale value\n\t * @param [y] y scale value, if not passed, it uses the x value\n\t * @returns Reference to this object for method chaining\n\t */\n\tscale(x: number, y = x) {\n\t\treturn this.set(this.x * x, this.y * y);\n\t}\n\n\t/**\n\t * Convert this vector into isometric coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\ttoIso() {\n\t\treturn this.set(this.x - this.y, (this.x + this.y) * 0.5);\n\t}\n\n\t/**\n\t * Convert this vector into 2d coordinate space\n\t * @returns Reference to this object for method chaining\n\t */\n\tto2d() {\n\t\treturn this.set(this.y + this.x / 2, this.y - this.x / 2);\n\t}\n\n\t/**\n\t * Multiply this vector values by the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tscaleV(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(this.x * v.x, this.y * v.y);\n\t}\n\n\t/**\n\t * Divide this vector values by the passed value\n\t * @param n - the value to divide the vector by\n\t * @returns Reference to this object for method chaining\n\t */\n\tdiv(n: number) {\n\t\treturn this.set(this.x / n, this.y / n);\n\t}\n\n\t/**\n\t * Update this vector values to absolute values\n\t * @returns Reference to this object for method chaining\n\t */\n\tabs() {\n\t\treturn this.set(\n\t\t\tthis.x < 0 ? -this.x : this.x,\n\t\t\tthis.y < 0 ? -this.y : this.y,\n\t\t);\n\t}\n\n\t/**\n\t * Clamp the vector value within the specified value range\n\t * @param low minimum component value\n\t * @param high maximum component value\n\t * @returns new me.Vector2d\n\t */\n\tclamp(low: number, high: number) {\n\t\treturn this._vector2d.clamp(low, high);\n\t}\n\n\t/**\n\t * Clamp this vector value within the specified value range\n\t * @param low minimum component value\n\t * @param high maximum component value\n\t * @returns Reference to this object for method chaining\n\t */\n\tclampSelf(low: number, high: number) {\n\t\treturn this._vector2d.clampSelf(low, high);\n\t}\n\n\t/**\n\t * Update this vector with the minimum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tminV(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(this.x < v.x ? this.x : v.x, this.y < v.y ? this.y : v.y);\n\t}\n\n\t/**\n\t * Update this vector with the maximum value between this and the passed vector\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tmaxV(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(this.x > v.x ? this.x : v.x, this.y > v.y ? this.y : v.y);\n\t}\n\n\t/**\n\t * Floor the vector values\n\t * @returns new Vector2d\n\t */\n\tfloor() {\n\t\treturn this._vector2d.floor();\n\t}\n\n\t/**\n\t * Floor this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tfloorSelf() {\n\t\treturn this._vector2d.floorSelf();\n\t}\n\n\t/**\n\t * Ceil the vector values\n\t * @returns new Vector2d\n\t */\n\tceil() {\n\t\treturn this._vector2d.ceil();\n\t}\n\n\t/**\n\t * Ceil this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tceilSelf() {\n\t\treturn this._vector2d.ceilSelf();\n\t}\n\n\t/**\n\t * Negate the vector values\n\t * @returns new Vector2d\n\t */\n\tnegate() {\n\t\treturn this._vector2d.negate();\n\t}\n\n\t/**\n\t * Negate this vector values\n\t * @returns Reference to this object for method chaining\n\t */\n\tnegateSelf() {\n\t\treturn this._vector2d.negateSelf();\n\t}\n\n\t/**\n\t * Copy the x,y values of the passed vector to this one\n\t * @param v other vector\n\t * @returns Reference to this object for method chaining\n\t */\n\tcopy(v: Vector2d | ObservableVector2d) {\n\t\treturn this.set(v.x, v.y);\n\t}\n\n\t/**\n\t * Checks if this vector is equal to another vector or a pair of coordinates.\n\t * @param args - Either two numbers representing x and y coordinates or a single Vector2d object.\n\t * @returns True if the coordinates are equal, false otherwise.\n\t * @example\n\t * let v1 = new Vector2d(3, 4);\n\t * let v2 = new Vector2d(3, 4);\n\t * v1.equals(v2); // returns true\n\t * @example\n\t * let v = new Vector2d(3, 4);\n\t * v.equals(3, 4); // returns true\n\t */\n\tequals(\n\t\t...args: [number, number] | [Vector2d] | [ObservableVector2d]\n\t): boolean {\n\t\tif (args.length === 2) {\n\t\t\treturn this.x === args[0] && this.y === args[1];\n\t\t}\n\t\treturn this.x === args[0].x && this.y === args[0].y;\n\t}\n\n\t/**\n\t * normalize this vector (scale the vector so that its magnitude is 1)\n\t * @returns Reference to this object for method chaining\n\t */\n\tnormalize() {\n\t\treturn this.div(this.length() || 1);\n\t}\n\n\t/**\n\t * change this vector to be perpendicular to what it was before.<br>\n\t * (Effectively rotates it 90 degrees in a clockwise direction)\n\t * @returns Reference to this object for method chaining\n\t */\n\tperp() {\n\t\treturn this.set(this.y, -this.x);\n\t}\n\n\t/**\n\t * Rotate this vector (counter-clockwise) by the specified angle (in radians).\n\t * @param angle - The angle to rotate (in radians)\n\t * @param [v] - an optional point to rotate around\n\t * @returns Reference to this object for method chaining\n\t */\n\trotate(angle: number, v?: Vector2d | ObservableVector2d) {\n\t\tlet cx = 0;\n\t\tlet cy = 0;\n\n\t\tif (v) {\n\t\t\tcx = v.x;\n\t\t\tcy = v.y;\n\t\t}\n\n\t\tconst x = this.x - cx;\n\t\tconst y = this.y - cy;\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\n\t\treturn this.set(x * c - y * s + cx, x * s + y * c + cy);\n\t}\n\n\t/**\n\t * return the dot product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The dot product.\n\t */\n\tdot(v: Vector2d | ObservableVector2d) {\n\t\treturn this._vector2d.dot(v as Vector2d);\n\t}\n\n\t/**\n\t * return the cross product of this vector and the passed one\n\t * @param v other vector\n\t * @returns The cross product.\n\t */\n\tcross(v: Vector2d | ObservableVector2d) {\n\t\treturn this._vector2d.cross(v as Vector2d);\n\t}\n\n\t/**\n\t * return the square length of this vector\n\t * @returns The length^2 of this vector.\n\t */\n\tlength2() {\n\t\treturn this._vector2d.length2();\n\t}\n\n\t/**\n\t * return the length (magnitude) of this vector\n\t * @returns the length of this vector\n\t */\n\tlength() {\n\t\treturn this._vector2d.length();\n\t}\n\n\t/**\n\t * Linearly interpolate between this vector and the given one.\n\t * @param v other vector\n\t * @param alpha - distance along the line (alpha = 0 will be this vector, and alpha = 1 will be the given one).\n\t * @returns Reference to this object for method chaining\n\t */\n\tlerp(v: Vector2d | ObservableVector2d, alpha: number) {\n\t\tthis.set(this.x + alpha * (v.x - this.x), this.y + alpha * (v.y - this.y));\n\t\treturn this;\n\t}\n\n\t/**\n\t * interpolate the position of this vector towards the given one by the given maximum step.\n\t * @param target vector to rotate towards\n\t * @param step - the maximum step per iteration (Negative values will push the vector away from the target)\n\t * @returns Reference to this object for method chaining\n\t */\n\tmoveTowards(target: Vector2d | ObservableVector2d, step: number) {\n\t\tconst angle = Math.atan2(target.y - this.y, target.x - this.x);\n\n\t\tconst distance = this.distance(target);\n\n\t\tif (distance === 0 || (step >= 0 && distance <= step * step)) {\n\t\t\treturn target;\n\t\t}\n\n\t\tthis.set(this.x + Math.cos(angle) * step, this.y + Math.sin(angle) * step);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the Euclidean distance between this vector and another vector.\n\t * @param v - The vector to which the distance is calculated.\n\t * @returns The Euclidean distance between this vector and the given vector.\n\t * @example\n\t * let v1 = new Vector2d(3, 4);\n\t * let v2 = new Vector2d(6, 8);\n\t * v1.distance(v2); // returns 5\n\t */\n\tdistance(v: Vector2d | ObservableVector2d) {\n\t\treturn this._vector2d.distance(v as Vector2d);\n\t}\n\n\t/**\n\t * return the angle between this vector and the passed one\n\t * @param v other vector\n\t * @returns angle in radians\n\t */\n\tangle(v: Vector2d | ObservableVector2d) {\n\t\treturn this._vector2d.angle(v as Vector2d);\n\t}\n\n\t/**\n\t * project this vector on to another vector.\n\t * @param v - The vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tproject(v: Vector2d | ObservableVector2d) {\n\t\treturn this.scale(this.dot(v) / v.length2());\n\t}\n\n\t/**\n\t * Project this vector onto a vector of unit length.<br>\n\t * This is slightly more efficient than `project` when dealing with unit vectors.\n\t * @param v - The unit vector to project onto.\n\t * @returns Reference to this object for method chaining\n\t */\n\tprojectN(v: Vector2d | ObservableVector2d) {\n\t\treturn this.scale(this.dot(v));\n\t}\n\n\t/**\n\t * return a clone copy of this vector\n\t * @param [cb] callback function to override the clone values\n\t * @returns new Vector2d\n\t */\n\tclone(cb?: () => void) {\n\t\treturn observableVector2dPool.get(this.x, this.y, cb);\n\t}\n\n\t/**\n\t * convert the object to a string representation\n\t * @returns stringified representation of this vector\n\t */\n\ttoString() {\n\t\treturn this._vector2d.toString();\n\t}\n\n\t/**\n\t * Revokes the proxy object, preventing further access to the ObservablePoint instance.\n\t */\n\trevoke() {\n\t\tthis._revoke();\n\t}\n}\n\nexport const observableVector2dPool = createPool<\n\tObservableVector2d,\n\t[x?: number | undefined, y?: number | undefined, callback?: () => void]\n>((x, y, cb) => {\n\tconst vector = new ObservableVector2d(x, y, cb);\n\n\treturn {\n\t\tinstance: vector,\n\t\treset(x = 0, y = 0, cb?: () => void): void {\n\t\t\tvector.setMuted(x, y);\n\t\t\tif (cb) {\n\t\t\t\tvector.setCallback(cb);\n\t\t\t}\n\t\t},\n\t};\n});\n", "import CanvasRenderer from \"../video/canvas/canvas_renderer.js\";\nimport CanvasRenderTarget from \"../video/rendertarget/canvasrendertarget.js\";\nimport WebGLRenderer from \"../video/webgl/webgl_renderer.js\";\nimport { warning } from \"./console.js\";\n\n/*\n * placeholder for all deprecated classes and corresponding alias for backward compatibility\n */\n\n/**\n * @deprecated since 17.1.0\n * @see CanvasRenderTarget\n */\nexport class CanvasTexture extends CanvasRenderTarget {\n\t/**\n\t * @param {number} width - the desired width of the canvas\n\t * @param {number} height - the desired height of the canvas\n\t * @param {object} attributes - The attributes to create both the canvas and context\n\t * @param {boolean} [attributes.context=\"2d\"] - the context type to be created (\"2d\", \"webgl\", \"webgl2\")\n\t * @param {boolean} [attributes.offscreenCanvas=false] - will create an offscreenCanvas if true instead of a standard canvas\n\t * @param {boolean} [attributes.willReadFrequently=false] - Indicates whether or not a lot of read-back operations are planned\n\t * @param {boolean} [attributes.antiAlias=false] - Whether to enable anti-aliasing, use false (default) for a pixelated effect.\n\t */\n\tconstructor(width, height, attributes) {\n\t\twarning(\"CanvasTexture\", \"CanvasRenderTarget\", \"17.1.0\");\n\t\tsuper(width, height, attributes);\n\t}\n}\n\n/**\n * return the height of the system Canvas\n * @public\n * @name setLineWidth\n * @memberof CanvasRenderer#\n * @deprecated since 17.3.0\n * @see lineWidth\n */\nCanvasRenderer.prototype.setLineWidth = function (width) {\n\twarning(\"setLineWidth\", \"lineWidth\", \"17.3.0\");\n\tthis.lineWidth = width;\n};\n\n/**\n * return the height of the system Canvas\n * @public\n * @name setLineWidth\n * @memberof WebGLRenderer#\n * @deprecated since 17.3.0\n * @see lineWidth\n */\nWebGLRenderer.prototype.setLineWidth = function (width) {\n\twarning(\"setLineWidth\", \"lineWidth\", \"17.3.0\");\n\tthis.lineWidth = width;\n};\n\n/**\n * @namespace Math\n * @deprecated since 18.0.0\n * Use lowercase `math` export instead.\n */\nexport * as Math from \"./../math/math.ts\";\n", "// ES5/ES6 polyfills\nimport \"./polyfill/index.ts\";\n\nimport Application from \"./application/application.js\";\nimport Camera2d from \"./camera/camera2d.js\";\nimport { initKeyboardEvent } from \"./input/keyboard.ts\";\nimport Pointer from \"./input/pointer.js\";\nimport TMXHexagonalRenderer from \"./level/tiled/renderer/TMXHexagonalRenderer.js\";\nimport TMXIsometricRenderer from \"./level/tiled/renderer/TMXIsometricRenderer.js\";\nimport TMXOrthogonalRenderer from \"./level/tiled/renderer/TMXOrthogonalRenderer.js\";\nimport TMXRenderer from \"./level/tiled/renderer/TMXRenderer.js\";\nimport TMXStaggeredRenderer from \"./level/tiled/renderer/TMXStaggeredRenderer.js\";\nimport TMXLayer from \"./level/tiled/TMXLayer.js\";\nimport Tile from \"./level/tiled/TMXTile.js\";\nimport TMXTileMap from \"./level/tiled/TMXTileMap.js\";\nimport TMXTileset from \"./level/tiled/TMXTileset.js\";\nimport TMXTilesetGroup from \"./level/tiled/TMXTilesetGroup.js\";\nimport * as TMXUtils from \"./level/tiled/TMXUtils.js\";\nimport { setNocache } from \"./loader/loader.js\";\nimport ParticleEmitter from \"./particles/emitter.js\";\nimport Particle from \"./particles/particle.ts\";\nimport ParticleEmitterSettings from \"./particles/settings.js\";\nimport Body from \"./physics/body.js\";\n// class definition\nimport QuadTree from \"./physics/quadtree.js\";\nimport World from \"./physics/world.js\";\n// utility classes\nimport { cache as plugins } from \"./plugin/plugin.js\";\nimport Collectable from \"./renderable/collectable.js\";\nimport ColorLayer from \"./renderable/colorlayer.js\";\nimport Container from \"./renderable/container.js\";\nimport { Draggable } from \"./renderable/draggable.js\";\nimport { DropTarget } from \"./renderable/dragndrop.js\";\nimport Entity from \"./renderable/entity/entity.js\";\nimport ImageLayer from \"./renderable/imagelayer.js\";\nimport Light2d from \"./renderable/light2d.js\";\nimport NineSliceSprite from \"./renderable/nineslicesprite.js\";\nimport Renderable from \"./renderable/renderable.js\";\nimport Sprite from \"./renderable/sprite.js\";\nimport BitmapText from \"./renderable/text/bitmaptext.js\";\nimport BitmapTextData from \"./renderable/text/bitmaptextdata.ts\";\nimport Text from \"./renderable/text/text.js\";\nimport Trigger from \"./renderable/trigger.js\";\nimport UIBaseElement from \"./renderable/ui/uibaseelement.js\";\nimport UISpriteElement from \"./renderable/ui/uispriteelement.js\";\nimport UITextButton from \"./renderable/ui/uitextbutton.js\";\nimport Stage from \"./state/stage.js\";\nimport state from \"./state/state.js\";\nimport { onReady } from \"./system/device.js\";\nimport { BOOT, DOM_READY, eventEmitter } from \"./system/event.ts\";\nimport pool from \"./system/legacy_pool.js\";\nimport save from \"./system/save.ts\";\nimport timer from \"./system/timer.ts\";\nimport Tween from \"./tweens/tween.ts\";\nimport { getUriFragment } from \"./utils/utils.ts\";\nimport { version } from \"./version.ts\";\nimport CanvasRenderer from \"./video/canvas/canvas_renderer.js\";\nimport Renderer from \"./video/renderer.js\";\nimport CanvasRenderTarget from \"./video/rendertarget/canvasrendertarget.js\";\nimport { TextureAtlas } from \"./video/texture/atlas.js\";\nimport Compositor from \"./video/webgl/compositors/compositor.js\";\nimport PrimitiveCompositor from \"./video/webgl/compositors/primitive_compositor.js\";\nimport QuadCompositor from \"./video/webgl/compositors/quad_compositor.js\";\nimport GLShader from \"./video/webgl/glshader.js\";\nimport WebGLRenderer from \"./video/webgl/webgl_renderer.js\";\n\nexport * from \"./application/scaleMethods.ts\";\nexport * from \"./application/settings.ts\";\n// export all utility function\nexport * as audio from \"./audio/audio.js\";\nexport * as input from \"./input/input.js\";\nexport { level } from \"./level/level.js\";\nexport * as loader from \"./loader/loader.js\";\nexport * as math from \"./math/math.ts\";\nexport { collision } from \"./physics/collision.js\";\nexport * as plugin from \"./plugin/plugin.js\";\nexport * as device from \"./system/device.js\";\nexport * as event from \"./system/event.ts\";\nexport * as utils from \"./utils/utils.ts\";\nexport * from \"./version.ts\";\nexport * as video from \"./video/video.js\";\nexport { plugins, save, timer, pool, state };\nexport { Ellipse } from \"./geometries/ellipse.ts\";\nexport { Line } from \"./geometries/line.ts\";\nexport { ObservablePoint } from \"./geometries/observablePoint.ts\";\nexport { Point } from \"./geometries/point.ts\";\nexport { Polygon } from \"./geometries/polygon.ts\";\nexport { Rect } from \"./geometries/rectangle.ts\";\nexport { RoundRect } from \"./geometries/roundrect.ts\";\nexport { Color } from \"./math/color.ts\";\nexport { Matrix2d } from \"./math/matrix2d.ts\";\nexport { Matrix3d } from \"./math/matrix3d.ts\";\nexport { ObservableVector2d } from \"./math/observableVector2d.ts\";\nexport { ObservableVector3d } from \"./math/observableVector3d.ts\";\nexport { Vector2d } from \"./math/vector2d.ts\";\nexport { Vector3d } from \"./math/vector3d.ts\";\nexport { Bounds } from \"./physics/bounds.ts\";\nexport { getPool } from \"./pool.ts\";\n\n// export all class definition\nexport {\n\tTween,\n\tQuadTree,\n\tGLShader,\n\tCompositor,\n\tPrimitiveCompositor,\n\tQuadCompositor,\n\tRenderer,\n\tWebGLRenderer,\n\tCanvasRenderer,\n\tCanvasRenderTarget,\n\tTextureAtlas,\n\tRenderable,\n\tBody,\n\tText,\n\tBitmapText,\n\tBitmapTextData,\n\tColorLayer,\n\tImageLayer,\n\tSprite,\n\tNineSliceSprite,\n\tUIBaseElement,\n\tUITextButton,\n\tUISpriteElement,\n\tCollectable,\n\tTrigger,\n\tLight2d,\n\tDraggable,\n\tDropTarget,\n\tTMXRenderer,\n\tTMXOrthogonalRenderer,\n\tTMXIsometricRenderer,\n\tTMXHexagonalRenderer,\n\tTMXStaggeredRenderer,\n\tTile,\n\tTMXTileset,\n\tTMXTilesetGroup,\n\tTMXTileMap,\n\tTMXLayer,\n\tTMXUtils,\n\tPointer,\n\tStage,\n\tCamera2d,\n\tContainer,\n\tWorld,\n\tParticleEmitter,\n\tParticleEmitterSettings,\n\tParticle,\n\tEntity,\n\tApplication,\n};\n\n// export all public constants\nexport * from \"./const.ts\";\n// Backward compatibility for deprecated method or properties\nexport * from \"./lang/deprecated.js\";\n\n/**\n * a flag indicating that melonJS is fully initialized\n * @type {boolean}\n * @default false\n * @readonly\n */\nexport let initialized = false;\n\n/**\n * disable melonJS auto-initialization\n * @type {boolean}\n * @see {@link boot}\n */\nexport let skipAutoInit = false;\n\n/**\n * game is a default instance of a melonJS Application and represents your current game,\n * it contains all the objects, tilemap layers, current viewport, collision map, etc...<br>\n * @namespace game\n */\nexport const game = new Application(0, 0, { legacy: true });\n\n/**\n * initialize the melonJS library.\n * this is automatically called unless me.skipAutoInit is set to true,\n * to allow asynchronous loaders to work.\n * @name boot\n * @see {@link skipAutoInit}\n * @public\n */\nexport function boot() {\n\t// don't do anything if already initialized (should not happen anyway)\n\tif (initialized === true) {\n\t\treturn;\n\t}\n\n\t// output melonJS version in the console\n\tif (!(\"__vitest_browser__\" in window)) {\n\t\tconsole.log(\"melonJS 2 (v\" + version + \") | http://melonjs.org\");\n\t}\n\n\t// register all built-ins objects into the object legacy pool\n\tpool.register(\"me.Entity\", Entity);\n\tpool.register(\"me.Collectable\", Collectable);\n\tpool.register(\"me.Trigger\", Trigger);\n\tpool.register(\"me.Light2d\", Light2d);\n\tpool.register(\"me.Particle\", Particle, true);\n\tpool.register(\"me.Sprite\", Sprite);\n\tpool.register(\"me.NineSliceSprite\", NineSliceSprite);\n\tpool.register(\"me.Renderable\", Renderable);\n\tpool.register(\"me.Text\", Text, true);\n\tpool.register(\"me.BitmapText\", BitmapText);\n\tpool.register(\"me.ImageLayer\", ImageLayer);\n\tpool.register(\"me.Tween\", Tween);\n\tpool.register(\"me.ColorLayer\", ColorLayer, true);\n\t// duplicate all entries if use with no namespace (e.g. es6)\n\tpool.register(\"Entity\", Entity);\n\tpool.register(\"Collectable\", Collectable);\n\tpool.register(\"Trigger\", Trigger);\n\tpool.register(\"Light2d\", Light2d);\n\tpool.register(\"Tween\", Tween, true);\n\tpool.register(\"Particle\", Particle, true);\n\tpool.register(\"Sprite\", Sprite);\n\tpool.register(\"NineSliceSprite\", NineSliceSprite);\n\tpool.register(\"Renderable\", Renderable);\n\tpool.register(\"Text\", Text, true);\n\tpool.register(\"BitmapText\", BitmapText);\n\tpool.register(\"ImageLayer\", ImageLayer);\n\tpool.register(\"Tween\", Tween);\n\tpool.register(\"ColorLayer\", ColorLayer, true);\n\n\t// publish Boot notification\n\teventEmitter.emit(BOOT);\n\n\t// enable/disable the cache\n\tsetNocache(getUriFragment().nocache || false);\n\n\t// automatically enable keyboard events\n\tinitKeyboardEvent();\n\n\t// mark melonJS as initialized\n\tinitialized = true;\n\n\t/// if auto init is disable and this function was called manually\n\tif (skipAutoInit === true) {\n\t\teventEmitter.emit(DOM_READY);\n\t}\n}\n\n// call the library init function when ready\nonReady(() => {\n\tif (skipAutoInit === false) {\n\t\tboot();\n\t}\n});\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AACA,QAAI,QAAQ,SAAU,IAAI;AACxB,aAAO,MAAM,GAAG,SAAS,QAAQ;AAAA,IACnC;AAGA,WAAO;AAAA,IAEL,MAAM,OAAO,cAAc,YAAY,UAAU,KACjD,MAAM,OAAO,UAAU,YAAY,MAAM;AAAA,IAEzC,MAAM,OAAO,QAAQ,YAAY,IAAI,KACrC,MAAM,OAAO,UAAU,YAAY,MAAM,KACzC,MAAM,OAAO,WAAQ,YAAY,OAAI;AAAA,IAEpC,4BAAY;AAAE,aAAO;AAAA,IAAM,GAAG,KAAK,SAAS,aAAa,EAAE;AAAA;AAAA;;;ACf9D;AAAA;AAAA;AACA,WAAO,UAAU,SAAU,MAAM;AAC/B,UAAI;AACF,eAAO,CAAC,CAAC,KAAK;AAAA,MAChB,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACPA;AAAA;AAAA;AACA,QAAI,QAAQ;AAGZ,WAAO,UAAU,CAAC,MAAM,WAAY;AAElC,aAAO,OAAO,eAAe,CAAC,GAAG,GAAG,EAAE,KAAK,WAAY;AAAE,eAAO;AAAA,MAAG,EAAE,CAAC,EAAE,CAAC,MAAM;AAAA,IACjF,CAAC;AAAA;AAAA;;;ACPD;AAAA;AAAA;AACA,QAAI,QAAQ;AAEZ,WAAO,UAAU,CAAC,MAAM,WAAY;AAElC,UAAI,QAAQ,WAAY;AAAA,MAAc,GAAG,KAAK;AAE9C,aAAO,OAAO,QAAQ,cAAc,KAAK,eAAe,WAAW;AAAA,IACrE,CAAC;AAAA;AAAA;;;ACRD;AAAA;AAAA;AACA,QAAI,cAAc;AAElB,QAAI,OAAO,SAAS,UAAU;AAE9B,WAAO,UAAU,cAAc,KAAK,KAAK,IAAI,IAAI,WAAY;AAC3D,aAAO,KAAK,MAAM,MAAM,SAAS;AAAA,IACnC;AAAA;AAAA;;;ACPA;AAAA;AAAA;AACA,QAAI,wBAAwB,CAAC,EAAE;AAE/B,QAAI,2BAA2B,OAAO;AAGtC,QAAI,cAAc,4BAA4B,CAAC,sBAAsB,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;AAIrF,YAAQ,IAAI,cAAc,SAAS,qBAAqB,GAAG;AACzD,UAAI,aAAa,yBAAyB,MAAM,CAAC;AACjD,aAAO,CAAC,CAAC,cAAc,WAAW;AAAA,IACpC,IAAI;AAAA;AAAA;;;ACbJ;AAAA;AAAA;AACA,WAAO,UAAU,SAAU,QAAQ,OAAO;AACxC,aAAO;AAAA,QACL,YAAY,EAAE,SAAS;AAAA,QACvB,cAAc,EAAE,SAAS;AAAA,QACzB,UAAU,EAAE,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACRA;AAAA;AAAA;AACA,QAAI,cAAc;AAElB,QAAI,oBAAoB,SAAS;AACjC,QAAI,OAAO,kBAAkB;AAE7B,QAAI,sBAAsB,eAAe,kBAAkB,KAAK,KAAK,MAAM,IAAI;AAE/E,WAAO,UAAU,cAAc,sBAAsB,SAAU,IAAI;AACjE,aAAO,WAAY;AACjB,eAAO,KAAK,MAAM,IAAI,SAAS;AAAA,MACjC;AAAA,IACF;AAAA;AAAA;;;ACZA;AAAA;AAAA;AACA,QAAI,cAAc;AAElB,QAAIA,YAAW,YAAY,CAAC,EAAE,QAAQ;AACtC,QAAI,cAAc,YAAY,GAAG,KAAK;AAEtC,WAAO,UAAU,SAAU,IAAI;AAC7B,aAAO,YAAYA,UAAS,EAAE,GAAG,GAAG,EAAE;AAAA,IACxC;AAAA;AAAA;;;ACRA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,QAAQ;AACZ,QAAI,UAAU;AAEd,QAAI,UAAU;AACd,QAAI,QAAQ,YAAY,GAAG,KAAK;AAGhC,WAAO,UAAU,MAAM,WAAY;AAGjC,aAAO,CAAC,QAAQ,GAAG,EAAE,qBAAqB,CAAC;AAAA,IAC7C,CAAC,IAAI,SAAU,IAAI;AACjB,aAAO,QAAQ,EAAE,MAAM,WAAW,MAAM,IAAI,EAAE,IAAI,QAAQ,EAAE;AAAA,IAC9D,IAAI;AAAA;AAAA;;;ACfJ;AAAA;AAAA;AAGA,WAAO,UAAU,SAAU,IAAI;AAC7B,aAAO,OAAO,QAAQ,OAAO;AAAA,IAC/B;AAAA;AAAA;;;ACLA;AAAA;AAAA;AACA,QAAI,oBAAoB;AAExB,QAAI,aAAa;AAIjB,WAAO,UAAU,SAAU,IAAI;AAC7B,UAAI,kBAAkB,EAAE,EAAG,OAAM,IAAI,WAAW,0BAA0B,EAAE;AAC5E,aAAO;AAAA,IACT;AAAA;AAAA;;;ACVA;AAAA;AAAA;AAEA,QAAI,gBAAgB;AACpB,QAAI,yBAAyB;AAE7B,WAAO,UAAU,SAAU,IAAI;AAC7B,aAAO,cAAc,uBAAuB,EAAE,CAAC;AAAA,IACjD;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAEA,QAAI,cAAc,OAAO,YAAY,YAAY,SAAS;AAK1D,WAAO,UAAU,OAAO,eAAe,eAAe,gBAAgB,SAAY,SAAU,UAAU;AACpG,aAAO,OAAO,YAAY,cAAc,aAAa;AAAA,IACvD,IAAI,SAAU,UAAU;AACtB,aAAO,OAAO,YAAY;AAAA,IAC5B;AAAA;AAAA;;;ACXA;AAAA;AAAA;AACA,QAAI,aAAa;AAEjB,WAAO,UAAU,SAAU,IAAI;AAC7B,aAAO,OAAO,MAAM,WAAW,OAAO,OAAO,WAAW,EAAE;AAAA,IAC5D;AAAA;AAAA;;;ACLA;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,aAAa;AAEjB,QAAI,YAAY,SAAU,UAAU;AAClC,aAAO,WAAW,QAAQ,IAAI,WAAW;AAAA,IAC3C;AAEA,WAAO,UAAU,SAAU,WAAW,QAAQ;AAC5C,aAAO,UAAU,SAAS,IAAI,UAAUA,YAAW,SAAS,CAAC,IAAIA,YAAW,SAAS,KAAKA,YAAW,SAAS,EAAE,MAAM;AAAA,IACxH;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,cAAc;AAElB,WAAO,UAAU,YAAY,CAAC,EAAE,aAAa;AAAA;AAAA;;;ACH7C;AAAA;AAAA;AACA,QAAIC,cAAa;AAEjB,QAAIC,aAAYD,YAAW;AAC3B,QAAI,YAAYC,cAAaA,WAAU;AAEvC,WAAO,UAAU,YAAY,OAAO,SAAS,IAAI;AAAA;AAAA;;;ACNjD;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,YAAY;AAEhB,QAAI,UAAUA,YAAW;AACzB,QAAI,OAAOA,YAAW;AACtB,QAAI,WAAW,WAAW,QAAQ,YAAY,QAAQ,KAAK;AAC3D,QAAI,KAAK,YAAY,SAAS;AAC9B,QAAI;AAAJ,QAAWC;AAEX,QAAI,IAAI;AACN,cAAQ,GAAG,MAAM,GAAG;AAGpB,MAAAA,WAAU,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,IACnE;AAIA,QAAI,CAACA,YAAW,WAAW;AACzB,cAAQ,UAAU,MAAM,aAAa;AACrC,UAAI,CAAC,SAAS,MAAM,CAAC,KAAK,IAAI;AAC5B,gBAAQ,UAAU,MAAM,eAAe;AACvC,YAAI,MAAO,CAAAA,WAAU,CAAC,MAAM,CAAC;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO,UAAUA;AAAA;AAAA;;;AC3BjB;AAAA;AAAA;AAEA,QAAI,aAAa;AACjB,QAAI,QAAQ;AACZ,QAAIC,cAAa;AAEjB,QAAI,UAAUA,YAAW;AAGzB,WAAO,UAAU,CAAC,CAAC,OAAO,yBAAyB,CAAC,MAAM,WAAY;AACpE,UAAI,SAAS,uBAAO,kBAAkB;AAKtC,aAAO,CAAC,QAAQ,MAAM,KAAK,EAAE,OAAO,MAAM,aAAa;AAAA,MAErD,CAAC,OAAO,QAAQ,cAAc,aAAa;AAAA,IAC/C,CAAC;AAAA;AAAA;;;AClBD;AAAA;AAAA;AAEA,QAAI,gBAAgB;AAEpB,WAAO,UAAU,iBACf,CAAC,OAAO,QACR,OAAO,OAAO,YAAY;AAAA;AAAA;;;ACN5B;AAAA;AAAA;AACA,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,gBAAgB;AACpB,QAAI,oBAAoB;AAExB,QAAI,UAAU;AAEd,WAAO,UAAU,oBAAoB,SAAU,IAAI;AACjD,aAAO,OAAO,MAAM;AAAA,IACtB,IAAI,SAAU,IAAI;AAChB,UAAI,UAAU,WAAW,QAAQ;AACjC,aAAO,WAAW,OAAO,KAAK,cAAc,QAAQ,WAAW,QAAQ,EAAE,CAAC;AAAA,IAC5E;AAAA;AAAA;;;ACbA;AAAA;AAAA;AACA,QAAI,UAAU;AAEd,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI;AACF,eAAO,QAAQ,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAI,aAAa;AACjB,QAAI,cAAc;AAElB,QAAI,aAAa;AAGjB,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,WAAW,QAAQ,EAAG,QAAO;AACjC,YAAM,IAAI,WAAW,YAAY,QAAQ,IAAI,oBAAoB;AAAA,IACnE;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,YAAY;AAChB,QAAI,oBAAoB;AAIxB,WAAO,UAAU,SAAU,GAAG,GAAG;AAC/B,UAAI,OAAO,EAAE,CAAC;AACd,aAAO,kBAAkB,IAAI,IAAI,SAAY,UAAU,IAAI;AAAA,IAC7D;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAI,OAAO;AACX,QAAI,aAAa;AACjB,QAAI,WAAW;AAEf,QAAI,aAAa;AAIjB,WAAO,UAAU,SAAU,OAAO,MAAM;AACtC,UAAI,IAAI;AACR,UAAI,SAAS,YAAY,WAAW,KAAK,MAAM,QAAQ,KAAK,CAAC,SAAS,MAAM,KAAK,IAAI,KAAK,CAAC,EAAG,QAAO;AACrG,UAAI,WAAW,KAAK,MAAM,OAAO,KAAK,CAAC,SAAS,MAAM,KAAK,IAAI,KAAK,CAAC,EAAG,QAAO;AAC/E,UAAI,SAAS,YAAY,WAAW,KAAK,MAAM,QAAQ,KAAK,CAAC,SAAS,MAAM,KAAK,IAAI,KAAK,CAAC,EAAG,QAAO;AACrG,YAAM,IAAI,WAAW,yCAAyC;AAAA,IAChE;AAAA;AAAA;;;ACfA;AAAA;AAAA;AACA,WAAO,UAAU;AAAA;AAAA;;;ACDjB;AAAA;AAAA;AACA,QAAIC,cAAa;AAGjB,QAAI,iBAAiB,OAAO;AAE5B,WAAO,UAAU,SAAU,KAAK,OAAO;AACrC,UAAI;AACF,uBAAeA,aAAY,KAAK,EAAE,OAAc,cAAc,MAAM,UAAU,KAAK,CAAC;AAAA,MACtF,SAAS,OAAO;AACd,QAAAA,YAAW,GAAG,IAAI;AAAA,MACpB;AAAE,aAAO;AAAA,IACX;AAAA;AAAA;;;ACZA;AAAA;AAAA;AACA,QAAI,UAAU;AACd,QAAIC,cAAa;AACjB,QAAI,uBAAuB;AAE3B,QAAI,SAAS;AACb,QAAI,QAAQ,OAAO,UAAUA,YAAW,MAAM,KAAK,qBAAqB,QAAQ,CAAC,CAAC;AAElF,KAAC,MAAM,aAAa,MAAM,WAAW,CAAC,IAAI,KAAK;AAAA,MAC7C,SAAS;AAAA,MACT,MAAM,UAAU,SAAS;AAAA,MACzB,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA;AAAA;;;ACdD;AAAA;AAAA;AACA,QAAI,QAAQ;AAEZ,WAAO,UAAU,SAAU,KAAK,OAAO;AACrC,aAAO,MAAM,GAAG,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;AAAA,IAC/C;AAAA;AAAA;;;ACLA;AAAA;AAAA;AACA,QAAI,yBAAyB;AAE7B,QAAI,UAAU;AAId,WAAO,UAAU,SAAU,UAAU;AACnC,aAAO,QAAQ,uBAAuB,QAAQ,CAAC;AAAA,IACjD;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,WAAW;AAEf,QAAI,iBAAiB,YAAY,CAAC,EAAE,cAAc;AAKlD,WAAO,UAAU,OAAO,UAAU,SAAS,OAAO,IAAI,KAAK;AACzD,aAAO,eAAe,SAAS,EAAE,GAAG,GAAG;AAAA,IACzC;AAAA;AAAA;;;ACXA;AAAA;AAAA;AACA,QAAI,cAAc;AAElB,QAAI,KAAK;AACT,QAAI,UAAU,KAAK,OAAO;AAC1B,QAAIC,YAAW,YAAY,IAAI,QAAQ;AAEvC,WAAO,UAAU,SAAU,KAAK;AAC9B,aAAO,aAAa,QAAQ,SAAY,KAAK,OAAO,OAAOA,UAAS,EAAE,KAAK,SAAS,EAAE;AAAA,IACxF;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,MAAM;AACV,QAAI,gBAAgB;AACpB,QAAI,oBAAoB;AAExB,QAAIC,UAASD,YAAW;AACxB,QAAI,wBAAwB,OAAO,KAAK;AACxC,QAAI,wBAAwB,oBAAoBC,QAAO,KAAK,KAAKA,UAASA,WAAUA,QAAO,iBAAiB;AAE5G,WAAO,UAAU,SAAU,MAAM;AAC/B,UAAI,CAAC,OAAO,uBAAuB,IAAI,GAAG;AACxC,8BAAsB,IAAI,IAAI,iBAAiB,OAAOA,SAAQ,IAAI,IAC9DA,QAAO,IAAI,IACX,sBAAsB,YAAY,IAAI;AAAA,MAC5C;AAAE,aAAO,sBAAsB,IAAI;AAAA,IACrC;AAAA;AAAA;;;AClBA;AAAA;AAAA;AACA,QAAI,OAAO;AACX,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,YAAY;AAChB,QAAI,sBAAsB;AAC1B,QAAI,kBAAkB;AAEtB,QAAI,aAAa;AACjB,QAAI,eAAe,gBAAgB,aAAa;AAIhD,WAAO,UAAU,SAAU,OAAO,MAAM;AACtC,UAAI,CAAC,SAAS,KAAK,KAAK,SAAS,KAAK,EAAG,QAAO;AAChD,UAAI,eAAe,UAAU,OAAO,YAAY;AAChD,UAAI;AACJ,UAAI,cAAc;AAChB,YAAI,SAAS,OAAW,QAAO;AAC/B,iBAAS,KAAK,cAAc,OAAO,IAAI;AACvC,YAAI,CAAC,SAAS,MAAM,KAAK,SAAS,MAAM,EAAG,QAAO;AAClD,cAAM,IAAI,WAAW,yCAAyC;AAAA,MAChE;AACA,UAAI,SAAS,OAAW,QAAO;AAC/B,aAAO,oBAAoB,OAAO,IAAI;AAAA,IACxC;AAAA;AAAA;;;ACzBA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,WAAW;AAIf,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,MAAM,YAAY,UAAU,QAAQ;AACxC,aAAO,SAAS,GAAG,IAAI,MAAM,MAAM;AAAA,IACrC;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,WAAW;AAEf,QAAIC,YAAWD,YAAW;AAE1B,QAAI,SAAS,SAASC,SAAQ,KAAK,SAASA,UAAS,aAAa;AAElE,WAAO,UAAU,SAAU,IAAI;AAC7B,aAAO,SAASA,UAAS,cAAc,EAAE,IAAI,CAAC;AAAA,IAChD;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,QAAQ;AACZ,QAAI,gBAAgB;AAGpB,WAAO,UAAU,CAAC,eAAe,CAAC,MAAM,WAAY;AAElD,aAAO,OAAO,eAAe,cAAc,KAAK,GAAG,KAAK;AAAA,QACtD,KAAK,WAAY;AAAE,iBAAO;AAAA,QAAG;AAAA,MAC/B,CAAC,EAAE,MAAM;AAAA,IACX,CAAC;AAAA;AAAA;;;ACXD;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,OAAO;AACX,QAAI,6BAA6B;AACjC,QAAI,2BAA2B;AAC/B,QAAI,kBAAkB;AACtB,QAAI,gBAAgB;AACpB,QAAI,SAAS;AACb,QAAI,iBAAiB;AAGrB,QAAI,4BAA4B,OAAO;AAIvC,YAAQ,IAAI,cAAc,4BAA4B,SAAS,yBAAyB,GAAG,GAAG;AAC5F,UAAI,gBAAgB,CAAC;AACrB,UAAI,cAAc,CAAC;AACnB,UAAI,eAAgB,KAAI;AACtB,eAAO,0BAA0B,GAAG,CAAC;AAAA,MACvC,SAAS,OAAO;AAAA,MAAc;AAC9B,UAAI,OAAO,GAAG,CAAC,EAAG,QAAO,yBAAyB,CAAC,KAAK,2BAA2B,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IACnG;AAAA;AAAA;;;ACtBA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,QAAQ;AAIZ,WAAO,UAAU,eAAe,MAAM,WAAY;AAEhD,aAAO,OAAO,eAAe,WAAY;AAAA,MAAc,GAAG,aAAa;AAAA,QACrE,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC,EAAE,cAAc;AAAA,IACnB,CAAC;AAAA;AAAA;;;ACZD;AAAA;AAAA;AACA,QAAI,WAAW;AAEf,QAAI,UAAU;AACd,QAAI,aAAa;AAGjB,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,SAAS,QAAQ,EAAG,QAAO;AAC/B,YAAM,IAAI,WAAW,QAAQ,QAAQ,IAAI,mBAAmB;AAAA,IAC9D;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,iBAAiB;AACrB,QAAI,0BAA0B;AAC9B,QAAI,WAAW;AACf,QAAI,gBAAgB;AAEpB,QAAI,aAAa;AAEjB,QAAI,kBAAkB,OAAO;AAE7B,QAAI,4BAA4B,OAAO;AACvC,QAAI,aAAa;AACjB,QAAI,eAAe;AACnB,QAAI,WAAW;AAIf,YAAQ,IAAI,cAAc,0BAA0B,SAAS,eAAe,GAAG,GAAG,YAAY;AAC5F,eAAS,CAAC;AACV,UAAI,cAAc,CAAC;AACnB,eAAS,UAAU;AACnB,UAAI,OAAO,MAAM,cAAc,MAAM,eAAe,WAAW,cAAc,YAAY,cAAc,CAAC,WAAW,QAAQ,GAAG;AAC5H,YAAI,UAAU,0BAA0B,GAAG,CAAC;AAC5C,YAAI,WAAW,QAAQ,QAAQ,GAAG;AAChC,YAAE,CAAC,IAAI,WAAW;AAClB,uBAAa;AAAA,YACX,cAAc,gBAAgB,aAAa,WAAW,YAAY,IAAI,QAAQ,YAAY;AAAA,YAC1F,YAAY,cAAc,aAAa,WAAW,UAAU,IAAI,QAAQ,UAAU;AAAA,YAClF,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAE,aAAO,gBAAgB,GAAG,GAAG,UAAU;AAAA,IAC3C,IAAI,kBAAkB,SAAS,eAAe,GAAG,GAAG,YAAY;AAC9D,eAAS,CAAC;AACV,UAAI,cAAc,CAAC;AACnB,eAAS,UAAU;AACnB,UAAI,eAAgB,KAAI;AACtB,eAAO,gBAAgB,GAAG,GAAG,UAAU;AAAA,MACzC,SAAS,OAAO;AAAA,MAAc;AAC9B,UAAI,SAAS,cAAc,SAAS,WAAY,OAAM,IAAI,WAAW,yBAAyB;AAC9F,UAAI,WAAW,WAAY,GAAE,CAAC,IAAI,WAAW;AAC7C,aAAO;AAAA,IACT;AAAA;AAAA;;;AC3CA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,uBAAuB;AAC3B,QAAI,2BAA2B;AAE/B,WAAO,UAAU,cAAc,SAAU,QAAQ,KAAK,OAAO;AAC3D,aAAO,qBAAqB,EAAE,QAAQ,KAAK,yBAAyB,GAAG,KAAK,CAAC;AAAA,IAC/E,IAAI,SAAU,QAAQ,KAAK,OAAO;AAChC,aAAO,GAAG,IAAI;AACd,aAAO;AAAA,IACT;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,SAAS;AAEb,QAAI,oBAAoB,SAAS;AAEjC,QAAI,gBAAgB,eAAe,OAAO;AAE1C,QAAI,SAAS,OAAO,mBAAmB,MAAM;AAE7C,QAAI,SAAS,WAAW,SAAS,YAAY;AAAA,IAAc,GAAG,SAAS;AACvE,QAAI,eAAe,WAAW,CAAC,eAAgB,eAAe,cAAc,mBAAmB,MAAM,EAAE;AAEvG,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACjBA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,aAAa;AACjB,QAAI,QAAQ;AAEZ,QAAI,mBAAmB,YAAY,SAAS,QAAQ;AAGpD,QAAI,CAAC,WAAW,MAAM,aAAa,GAAG;AACpC,YAAM,gBAAgB,SAAU,IAAI;AAClC,eAAO,iBAAiB,EAAE;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO,UAAU,MAAM;AAAA;AAAA;;;ACdvB;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,aAAa;AAEjB,QAAI,UAAUA,YAAW;AAEzB,WAAO,UAAU,WAAW,OAAO,KAAK,cAAc,KAAK,OAAO,OAAO,CAAC;AAAA;AAAA;;;ACN1E;AAAA;AAAA;AACA,QAAI,SAAS;AACb,QAAI,MAAM;AAEV,QAAI,OAAO,OAAO,MAAM;AAExB,WAAO,UAAU,SAAU,KAAK;AAC9B,aAAO,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,IAAI,GAAG;AAAA,IAC1C;AAAA;AAAA;;;ACRA;AAAA;AAAA;AACA,WAAO,UAAU,CAAC;AAAA;AAAA;;;ACDlB;AAAA;AAAA;AACA,QAAI,kBAAkB;AACtB,QAAIC,cAAa;AACjB,QAAI,WAAW;AACf,QAAI,8BAA8B;AAClC,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,YAAY;AAChB,QAAI,aAAa;AAEjB,QAAI,6BAA6B;AACjC,QAAIC,aAAYD,YAAW;AAC3B,QAAI,UAAUA,YAAW;AACzB,QAAI;AAAJ,QAASE;AAAT,QAAc;AAEd,QAAI,UAAU,SAAU,IAAI;AAC1B,aAAO,IAAI,EAAE,IAAIA,KAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,IACvC;AAEA,QAAI,YAAY,SAAU,MAAM;AAC9B,aAAO,SAAU,IAAI;AACnB,YAAIC;AACJ,YAAI,CAAC,SAAS,EAAE,MAAMA,SAAQD,KAAI,EAAE,GAAG,SAAS,MAAM;AACpD,gBAAM,IAAID,WAAU,4BAA4B,OAAO,WAAW;AAAA,QACpE;AAAE,eAAOE;AAAA,MACX;AAAA,IACF;AAEA,QAAI,mBAAmB,OAAO,OAAO;AAC/B,cAAQ,OAAO,UAAU,OAAO,QAAQ,IAAI,QAAQ;AAExD,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,MAAM;AAElB,YAAM,SAAU,IAAI,UAAU;AAC5B,YAAI,MAAM,IAAI,EAAE,EAAG,OAAM,IAAIF,WAAU,0BAA0B;AACjE,iBAAS,SAAS;AAClB,cAAM,IAAI,IAAI,QAAQ;AACtB,eAAO;AAAA,MACT;AACA,MAAAC,OAAM,SAAU,IAAI;AAClB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC;AAAA,MAC3B;AACA,YAAM,SAAU,IAAI;AAClB,eAAO,MAAM,IAAI,EAAE;AAAA,MACrB;AAAA,IACF,OAAO;AACD,cAAQ,UAAU,OAAO;AAC7B,iBAAW,KAAK,IAAI;AACpB,YAAM,SAAU,IAAI,UAAU;AAC5B,YAAI,OAAO,IAAI,KAAK,EAAG,OAAM,IAAID,WAAU,0BAA0B;AACrE,iBAAS,SAAS;AAClB,oCAA4B,IAAI,OAAO,QAAQ;AAC/C,eAAO;AAAA,MACT;AACA,MAAAC,OAAM,SAAU,IAAI;AAClB,eAAO,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,MAC1C;AACA,YAAM,SAAU,IAAI;AAClB,eAAO,OAAO,IAAI,KAAK;AAAA,MACzB;AAAA,IACF;AAjCM;AAmBA;AAgBN,WAAO,UAAU;AAAA,MACf;AAAA,MACA,KAAKA;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACtEA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,QAAQ;AACZ,QAAI,aAAa;AACjB,QAAI,SAAS;AACb,QAAI,cAAc;AAClB,QAAI,6BAA6B,wBAAsC;AACvE,QAAI,gBAAgB;AACpB,QAAI,sBAAsB;AAE1B,QAAI,uBAAuB,oBAAoB;AAC/C,QAAI,mBAAmB,oBAAoB;AAC3C,QAAI,UAAU;AAEd,QAAI,iBAAiB,OAAO;AAC5B,QAAI,cAAc,YAAY,GAAG,KAAK;AACtC,QAAI,UAAU,YAAY,GAAG,OAAO;AACpC,QAAI,OAAO,YAAY,CAAC,EAAE,IAAI;AAE9B,QAAI,sBAAsB,eAAe,CAAC,MAAM,WAAY;AAC1D,aAAO,eAAe,WAAY;AAAA,MAAc,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW;AAAA,IACxF,CAAC;AAED,QAAI,WAAW,OAAO,MAAM,EAAE,MAAM,QAAQ;AAE5C,QAAI,cAAc,OAAO,UAAU,SAAU,OAAO,MAAM,SAAS;AACjE,UAAI,YAAY,QAAQ,IAAI,GAAG,GAAG,CAAC,MAAM,WAAW;AAClD,eAAO,MAAM,QAAQ,QAAQ,IAAI,GAAG,yBAAyB,IAAI,IAAI;AAAA,MACvE;AACA,UAAI,WAAW,QAAQ,OAAQ,QAAO,SAAS;AAC/C,UAAI,WAAW,QAAQ,OAAQ,QAAO,SAAS;AAC/C,UAAI,CAAC,OAAO,OAAO,MAAM,KAAM,8BAA8B,MAAM,SAAS,MAAO;AACjF,YAAI,YAAa,gBAAe,OAAO,QAAQ,EAAE,OAAO,MAAM,cAAc,KAAK,CAAC;AAAA,YAC7E,OAAM,OAAO;AAAA,MACpB;AACA,UAAI,uBAAuB,WAAW,OAAO,SAAS,OAAO,KAAK,MAAM,WAAW,QAAQ,OAAO;AAChG,uBAAe,OAAO,UAAU,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,MAC1D;AACA,UAAI;AACF,YAAI,WAAW,OAAO,SAAS,aAAa,KAAK,QAAQ,aAAa;AACpE,cAAI,YAAa,gBAAe,OAAO,aAAa,EAAE,UAAU,MAAM,CAAC;AAAA,QAEzE,WAAW,MAAM,UAAW,OAAM,YAAY;AAAA,MAChD,SAAS,OAAO;AAAA,MAAc;AAC9B,UAAIE,SAAQ,qBAAqB,KAAK;AACtC,UAAI,CAAC,OAAOA,QAAO,QAAQ,GAAG;AAC5B,QAAAA,OAAM,SAAS,KAAK,UAAU,OAAO,QAAQ,WAAW,OAAO,EAAE;AAAA,MACnE;AAAE,aAAO;AAAA,IACX;AAIA,aAAS,UAAU,WAAW,YAAY,SAASC,YAAW;AAC5D,aAAO,WAAW,IAAI,KAAK,iBAAiB,IAAI,EAAE,UAAU,cAAc,IAAI;AAAA,IAChF,GAAG,UAAU;AAAA;AAAA;;;ACtDb;AAAA;AAAA;AACA,QAAI,aAAa;AACjB,QAAI,uBAAuB;AAC3B,QAAI,cAAc;AAClB,QAAI,uBAAuB;AAE3B,WAAO,UAAU,SAAU,GAAG,KAAK,OAAO,SAAS;AACjD,UAAI,CAAC,QAAS,WAAU,CAAC;AACzB,UAAI,SAAS,QAAQ;AACrB,UAAI,OAAO,QAAQ,SAAS,SAAY,QAAQ,OAAO;AACvD,UAAI,WAAW,KAAK,EAAG,aAAY,OAAO,MAAM,OAAO;AACvD,UAAI,QAAQ,QAAQ;AAClB,YAAI,OAAQ,GAAE,GAAG,IAAI;AAAA,YAChB,sBAAqB,KAAK,KAAK;AAAA,MACtC,OAAO;AACL,YAAI;AACF,cAAI,CAAC,QAAQ,OAAQ,QAAO,EAAE,GAAG;AAAA,mBACxB,EAAE,GAAG,EAAG,UAAS;AAAA,QAC5B,SAAS,OAAO;AAAA,QAAc;AAC9B,YAAI,OAAQ,GAAE,GAAG,IAAI;AAAA,YAChB,sBAAqB,EAAE,GAAG,KAAK;AAAA,UAClC;AAAA,UACA,YAAY;AAAA,UACZ,cAAc,CAAC,QAAQ;AAAA,UACvB,UAAU,CAAC,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAAE,aAAO;AAAA,IACX;AAAA;AAAA;;;AC3BA;AAAA;AAAA;AACA,QAAI,OAAO,KAAK;AAChB,QAAI,QAAQ,KAAK;AAKjB,WAAO,UAAU,KAAK,SAAS,SAAS,MAAM,GAAG;AAC/C,UAAI,IAAI,CAAC;AACT,cAAQ,IAAI,IAAI,QAAQ,MAAM,CAAC;AAAA,IACjC;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,QAAQ;AAIZ,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,SAAS,CAAC;AAEd,aAAO,WAAW,UAAU,WAAW,IAAI,IAAI,MAAM,MAAM;AAAA,IAC7D;AAAA;AAAA;;;ACTA;AAAA;AAAA;AACA,QAAI,sBAAsB;AAE1B,QAAI,MAAM,KAAK;AACf,QAAI,MAAM,KAAK;AAKf,WAAO,UAAU,SAAU,OAAO,QAAQ;AACxC,UAAI,UAAU,oBAAoB,KAAK;AACvC,aAAO,UAAU,IAAI,IAAI,UAAU,QAAQ,CAAC,IAAI,IAAI,SAAS,MAAM;AAAA,IACrE;AAAA;AAAA;;;ACZA;AAAA;AAAA;AACA,QAAI,sBAAsB;AAE1B,QAAI,MAAM,KAAK;AAIf,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,MAAM,oBAAoB,QAAQ;AACtC,aAAO,MAAM,IAAI,IAAI,KAAK,gBAAgB,IAAI;AAAA,IAChD;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,WAAW;AAIf,WAAO,UAAU,SAAU,KAAK;AAC9B,aAAO,SAAS,IAAI,MAAM;AAAA,IAC5B;AAAA;AAAA;;;ACPA;AAAA;AAAA;AACA,QAAI,kBAAkB;AACtB,QAAI,kBAAkB;AACtB,QAAI,oBAAoB;AAGxB,QAAI,eAAe,SAAU,aAAa;AACxC,aAAO,SAAU,OAAO,IAAI,WAAW;AACrC,YAAI,IAAI,gBAAgB,KAAK;AAC7B,YAAI,SAAS,kBAAkB,CAAC;AAChC,YAAI,WAAW,EAAG,QAAO,CAAC,eAAe;AACzC,YAAI,QAAQ,gBAAgB,WAAW,MAAM;AAC7C,YAAI;AAGJ,YAAI,eAAe,OAAO,GAAI,QAAO,SAAS,OAAO;AACnD,kBAAQ,EAAE,OAAO;AAEjB,cAAI,UAAU,MAAO,QAAO;AAAA,QAE9B;AAAA,YAAO,QAAM,SAAS,OAAO,SAAS;AACpC,eAAK,eAAe,SAAS,MAAM,EAAE,KAAK,MAAM,GAAI,QAAO,eAAe,SAAS;AAAA,QACrF;AAAE,eAAO,CAAC,eAAe;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO,UAAU;AAAA;AAAA;AAAA,MAGf,UAAU,aAAa,IAAI;AAAA;AAAA;AAAA,MAG3B,SAAS,aAAa,KAAK;AAAA,IAC7B;AAAA;AAAA;;;ACjCA;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,SAAS;AACb,QAAI,kBAAkB;AACtB,QAAI,UAAU,yBAAuC;AACrD,QAAI,aAAa;AAEjB,QAAI,OAAO,YAAY,CAAC,EAAE,IAAI;AAE9B,WAAO,UAAU,SAAU,QAAQ,OAAO;AACxC,UAAI,IAAI,gBAAgB,MAAM;AAC9B,UAAI,IAAI;AACR,UAAI,SAAS,CAAC;AACd,UAAI;AACJ,WAAK,OAAO,EAAG,EAAC,OAAO,YAAY,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,KAAK,QAAQ,GAAG;AAE7E,aAAO,MAAM,SAAS,EAAG,KAAI,OAAO,GAAG,MAAM,MAAM,GAAG,CAAC,GAAG;AACxD,SAAC,QAAQ,QAAQ,GAAG,KAAK,KAAK,QAAQ,GAAG;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AAAA;AAAA;;;ACpBA;AAAA;AAAA;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACVA;AAAA;AAAA;AACA,QAAI,qBAAqB;AACzB,QAAI,cAAc;AAElB,QAAI,aAAa,YAAY,OAAO,UAAU,WAAW;AAKzD,YAAQ,IAAI,OAAO,uBAAuB,SAAS,oBAAoB,GAAG;AACxE,aAAO,mBAAmB,GAAG,UAAU;AAAA,IACzC;AAAA;AAAA;;;ACXA;AAAA;AAAA;AAEA,YAAQ,IAAI,OAAO;AAAA;AAAA;;;ACFnB;AAAA;AAAA;AACA,QAAI,aAAa;AACjB,QAAI,cAAc;AAClB,QAAI,4BAA4B;AAChC,QAAI,8BAA8B;AAClC,QAAI,WAAW;AAEf,QAAI,SAAS,YAAY,CAAC,EAAE,MAAM;AAGlC,WAAO,UAAU,WAAW,WAAW,SAAS,KAAK,SAAS,QAAQ,IAAI;AACxE,UAAI,OAAO,0BAA0B,EAAE,SAAS,EAAE,CAAC;AACnD,UAAI,wBAAwB,4BAA4B;AACxD,aAAO,wBAAwB,OAAO,MAAM,sBAAsB,EAAE,CAAC,IAAI;AAAA,IAC3E;AAAA;AAAA;;;ACdA;AAAA;AAAA;AACA,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI,iCAAiC;AACrC,QAAI,uBAAuB;AAE3B,WAAO,UAAU,SAAU,QAAQ,QAAQ,YAAY;AACrD,UAAI,OAAO,QAAQ,MAAM;AACzB,UAAI,iBAAiB,qBAAqB;AAC1C,UAAI,2BAA2B,+BAA+B;AAC9D,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAI,MAAM,KAAK,CAAC;AAChB,YAAI,CAAC,OAAO,QAAQ,GAAG,KAAK,EAAE,cAAc,OAAO,YAAY,GAAG,IAAI;AACpE,yBAAe,QAAQ,KAAK,yBAAyB,QAAQ,GAAG,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChBA;AAAA;AAAA;AACA,QAAI,QAAQ;AACZ,QAAI,aAAa;AAEjB,QAAI,cAAc;AAElB,QAAI,WAAW,SAAU,SAAS,WAAW;AAC3C,UAAI,QAAQC,MAAKC,WAAU,OAAO,CAAC;AACnC,aAAO,UAAU,WAAW,OACxB,UAAU,SAAS,QACnB,WAAW,SAAS,IAAI,MAAM,SAAS,IACvC,CAAC,CAAC;AAAA,IACR;AAEA,QAAIA,aAAY,SAAS,YAAY,SAAU,QAAQ;AACrD,aAAO,OAAO,MAAM,EAAE,QAAQ,aAAa,GAAG,EAAE,YAAY;AAAA,IAC9D;AAEA,QAAID,QAAO,SAAS,OAAO,CAAC;AAC5B,QAAI,SAAS,SAAS,SAAS;AAC/B,QAAI,WAAW,SAAS,WAAW;AAEnC,WAAO,UAAU;AAAA;AAAA;;;ACtBjB;AAAA;AAAA;AACA,QAAIE,cAAa;AACjB,QAAI,2BAA2B,6CAA2D;AAC1F,QAAI,8BAA8B;AAClC,QAAI,gBAAgB;AACpB,QAAI,uBAAuB;AAC3B,QAAI,4BAA4B;AAChC,QAAI,WAAW;AAiBf,WAAO,UAAU,SAAU,SAAS,QAAQ;AAC1C,UAAI,SAAS,QAAQ;AACrB,UAAI,SAAS,QAAQ;AACrB,UAAI,SAAS,QAAQ;AACrB,UAAI,QAAQ,QAAQ,KAAK,gBAAgB,gBAAgB;AACzD,UAAI,QAAQ;AACV,iBAASA;AAAA,MACX,WAAW,QAAQ;AACjB,iBAASA,YAAW,MAAM,KAAK,qBAAqB,QAAQ,CAAC,CAAC;AAAA,MAChE,OAAO;AACL,iBAASA,YAAW,MAAM,KAAKA,YAAW,MAAM,EAAE;AAAA,MACpD;AACA,UAAI,OAAQ,MAAK,OAAO,QAAQ;AAC9B,yBAAiB,OAAO,GAAG;AAC3B,YAAI,QAAQ,gBAAgB;AAC1B,uBAAa,yBAAyB,QAAQ,GAAG;AACjD,2BAAiB,cAAc,WAAW;AAAA,QAC5C,MAAO,kBAAiB,OAAO,GAAG;AAClC,iBAAS,SAAS,SAAS,MAAM,UAAU,SAAS,MAAM,OAAO,KAAK,QAAQ,MAAM;AAEpF,YAAI,CAAC,UAAU,mBAAmB,QAAW;AAC3C,cAAI,OAAO,kBAAkB,OAAO,eAAgB;AACpD,oCAA0B,gBAAgB,cAAc;AAAA,QAC1D;AAEA,YAAI,QAAQ,QAAS,kBAAkB,eAAe,MAAO;AAC3D,sCAA4B,gBAAgB,QAAQ,IAAI;AAAA,QAC1D;AACA,sBAAc,QAAQ,KAAK,gBAAgB,OAAO;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;;;ACtDA;AAAA;AAAA;AACA,QAAI,IAAI;AACR,QAAIC,cAAa;AAIjB,MAAE,EAAE,QAAQ,MAAM,QAAQA,YAAW,eAAeA,YAAW,GAAG;AAAA,MAChE,YAAYA;AAAA,IACd,CAAC;AAAA;AAAA;;;ACRD;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,IAAAC,uBAAA;AAAA;AAAA;AAEA;AACA,QAAIC,cAAa;AAEjB,WAAO,UAAUA;AAAA;AAAA;;;ACLjB;AAAA;AAAA;AACA,QAAI,kBAAkB;AAEtB,QAAI,gBAAgB,gBAAgB,aAAa;AACjD,QAAI,OAAO,CAAC;AAEZ,SAAK,aAAa,IAAI;AAEtB,WAAO,UAAU,OAAO,IAAI,MAAM;AAAA;AAAA;;;ACRlC;AAAA;AAAA;AACA,QAAI,wBAAwB;AAC5B,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,kBAAkB;AAEtB,QAAI,gBAAgB,gBAAgB,aAAa;AACjD,QAAI,UAAU;AAGd,QAAI,oBAAoB,WAAW,4BAAY;AAAE,aAAO;AAAA,IAAW,GAAE,CAAC,MAAM;AAG5E,QAAI,SAAS,SAAU,IAAI,KAAK;AAC9B,UAAI;AACF,eAAO,GAAG,GAAG;AAAA,MACf,SAAS,OAAO;AAAA,MAAc;AAAA,IAChC;AAGA,WAAO,UAAU,wBAAwB,aAAa,SAAU,IAAI;AAClE,UAAI,GAAG,KAAK;AACZ,aAAO,OAAO,SAAY,cAAc,OAAO,OAAO,SAElD,QAAQ,MAAM,OAAO,IAAI,QAAQ,EAAE,GAAG,aAAa,MAAM,WAAW,MAEpE,oBAAoB,WAAW,CAAC,KAE/B,SAAS,WAAW,CAAC,OAAO,YAAY,WAAW,EAAE,MAAM,IAAI,cAAc;AAAA,IACpF;AAAA;AAAA;;;AC7BA;AAAA;AAAA;AACA,QAAI,UAAU;AAEd,QAAI,UAAU;AAEd,WAAO,UAAU,SAAU,UAAU;AACnC,UAAI,QAAQ,QAAQ,MAAM,SAAU,OAAM,IAAI,UAAU,2CAA2C;AACnG,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA;AAAA;;;ACRA;AAAA;AAAA;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACFjB;AAAA;AAAA;AACA,QAAI,cAAc;AAClB,QAAI,yBAAyB;AAC7B,QAAIC,YAAW;AACf,QAAI,cAAc;AAElB,QAAI,UAAU,YAAY,GAAG,OAAO;AACpC,QAAI,QAAQ,OAAO,OAAO,cAAc,IAAI;AAC5C,QAAI,QAAQ,OAAO,UAAU,cAAc,QAAQ,cAAc,KAAK;AAGtE,QAAI,eAAe,SAAU,MAAM;AACjC,aAAO,SAAU,OAAO;AACtB,YAAI,SAASA,UAAS,uBAAuB,KAAK,CAAC;AACnD,YAAI,OAAO,EAAG,UAAS,QAAQ,QAAQ,OAAO,EAAE;AAChD,YAAI,OAAO,EAAG,UAAS,QAAQ,QAAQ,OAAO,IAAI;AAClD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,UAAU;AAAA;AAAA;AAAA,MAGf,OAAO,aAAa,CAAC;AAAA;AAAA;AAAA,MAGrB,KAAK,aAAa,CAAC;AAAA;AAAA;AAAA,MAGnB,MAAM,aAAa,CAAC;AAAA,IACtB;AAAA;AAAA;;;AC9BA;AAAA;AAAA;AACA,QAAI,uBAAuB,wBAAsC;AACjE,QAAI,QAAQ;AACZ,QAAI,cAAc;AAElB,QAAI,MAAM;AAIV,WAAO,UAAU,SAAU,aAAa;AACtC,aAAO,MAAM,WAAY;AACvB,eAAO,CAAC,CAAC,YAAY,WAAW,EAAE,KAC7B,IAAI,WAAW,EAAE,MAAM,OACtB,wBAAwB,YAAY,WAAW,EAAE,SAAS;AAAA,MAClE,CAAC;AAAA,IACH;AAAA;AAAA;;;ACfA;AAAA;AAAA;AACA,QAAI,aAAa,sBAAoC;AACrD,QAAI,yBAAyB;AAK7B,WAAO,UAAU,uBAAuB,WAAW,IAAI,SAAS,YAAY;AAC1E,aAAO,WAAW,IAAI;AAAA,IAExB,IAAI,GAAG;AAAA;AAAA;;;ACVP;AAAA;AAAA;AACA,QAAI,IAAI;AACR,QAAI,YAAY;AAKhB,MAAE,EAAE,QAAQ,UAAU,OAAO,MAAM,MAAM,aAAa,QAAQ,GAAG,aAAa,UAAU,GAAG;AAAA,MACzF,UAAU;AAAA,IACZ,CAAC;AAAA;AAAA;;;ACTD;AAAA;AAAA;AAEA;AACA,QAAI,IAAI;AACR,QAAI,YAAY;AAKhB,MAAE,EAAE,QAAQ,UAAU,OAAO,MAAM,MAAM,aAAa,QAAQ,GAAG,cAAc,UAAU,GAAG;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA;AAAA;;;ACXD;AAAA;AAAA;AACA,QAAIC,cAAa;AACjB,QAAI,cAAc;AAElB,WAAO,UAAU,SAAU,aAAa,QAAQ;AAC9C,aAAO,YAAYA,YAAW,WAAW,EAAE,UAAU,MAAM,CAAC;AAAA,IAC9D;AAAA;AAAA;;;ACNA;AAAA;AAAA;AACA;AACA,QAAI,cAAc;AAElB,WAAO,UAAU,YAAY,UAAU,UAAU;AAAA;AAAA;;;ACJjD;AAAA;AAAA;AACA,QAAI,WAAW,sBAAoC;AACnD,QAAI,yBAAyB;AAK7B,WAAO,UAAU,uBAAuB,SAAS,IAAI,SAAS,UAAU;AACtE,aAAO,SAAS,IAAI;AAAA,IAEtB,IAAI,GAAG;AAAA;AAAA;;;ACVP;AAAA;AAAA;AACA,QAAI,IAAI;AACR,QAAI,UAAU;AAKd,MAAE,EAAE,QAAQ,UAAU,OAAO,MAAM,MAAM,WAAW,QAAQ,GAAG,cAAc,QAAQ,GAAG;AAAA,MACtF,WAAW;AAAA,IACb,CAAC;AAAA;AAAA;;;ACTD;AAAA;AAAA;AAEA;AACA,QAAI,IAAI;AACR,QAAI,UAAU;AAKd,MAAE,EAAE,QAAQ,UAAU,OAAO,MAAM,MAAM,WAAW,QAAQ,GAAG,YAAY,QAAQ,GAAG;AAAA,MACpF;AAAA,IACF,CAAC;AAAA;AAAA;;;ACXD;AAAA;AAAA;AACA;AACA,QAAI,cAAc;AAElB,WAAO,UAAU,YAAY,UAAU,WAAW;AAAA;AAAA;;;ACJlD;AAAA;AAUA,KAAC,WAAW;AAEV;AASA,UAAIC,gBAAe,WAAW;AAC5B,aAAK,KAAK;AAAA,MACZ;AACA,MAAAA,cAAa,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QAKvB,MAAM,WAAW;AACf,cAAIC,QAAO,QAAQC;AAGnB,UAAAD,MAAK,WAAW;AAGhB,UAAAA,MAAK,kBAAkB,CAAC;AACxB,UAAAA,MAAK,gBAAgB;AAGrB,UAAAA,MAAK,UAAU,CAAC;AAChB,UAAAA,MAAK,SAAS,CAAC;AACf,UAAAA,MAAK,SAAS;AACd,UAAAA,MAAK,UAAU;AACf,UAAAA,MAAK,gBAAgB;AACrB,UAAAA,MAAK,aAAc,OAAO,WAAW,eAAe,OAAO,YAAa,OAAO,YAAY;AAG3F,UAAAA,MAAK,aAAa;AAClB,UAAAA,MAAK,UAAU;AACf,UAAAA,MAAK,gBAAgB;AACrB,UAAAA,MAAK,cAAc;AACnB,UAAAA,MAAK,MAAM;AAGX,UAAAA,MAAK,aAAa;AAGlB,UAAAA,MAAK,OAAO;AAEZ,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,QAAQ,SAAS,KAAK;AACpB,cAAIA,QAAO,QAAQC;AACnB,gBAAM,WAAW,GAAG;AAGpB,cAAI,CAACD,MAAK,KAAK;AACb,8BAAkB;AAAA,UACpB;AAEA,cAAI,OAAO,QAAQ,eAAe,OAAO,KAAK,OAAO,GAAG;AACtD,YAAAA,MAAK,UAAU;AAGf,gBAAIA,MAAK,QAAQ;AACf,qBAAOA;AAAA,YACT;AAGA,gBAAIA,MAAK,eAAe;AACtB,cAAAA,MAAK,WAAW,KAAK,eAAe,KAAKC,QAAO,IAAI,WAAW;AAAA,YACjE;AAGA,qBAAS,IAAE,GAAG,IAAED,MAAK,OAAO,QAAQ,KAAK;AACvC,kBAAI,CAACA,MAAK,OAAO,CAAC,EAAE,WAAW;AAE7B,oBAAI,MAAMA,MAAK,OAAO,CAAC,EAAE,aAAa;AAGtC,yBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC/B,sBAAIE,SAAQF,MAAK,OAAO,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC;AAE5C,sBAAIE,UAASA,OAAM,OAAO;AACxB,oBAAAA,OAAM,MAAM,SAASA,OAAM,UAAU;AAAA,kBACvC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,mBAAOF;AAAA,UACT;AAEA,iBAAOA,MAAK;AAAA,QACd;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,MAAM,SAASG,QAAO;AACpB,cAAIH,QAAO,QAAQC;AAGnB,cAAI,CAACD,MAAK,KAAK;AACb,8BAAkB;AAAA,UACpB;AAEA,UAAAA,MAAK,SAASG;AAGd,cAAIH,MAAK,eAAe;AACtB,YAAAA,MAAK,WAAW,KAAK,eAAeG,SAAQ,IAAIH,MAAK,SAASC,QAAO,IAAI,WAAW;AAAA,UACtF;AAGA,mBAAS,IAAE,GAAG,IAAED,MAAK,OAAO,QAAQ,KAAK;AACvC,gBAAI,CAACA,MAAK,OAAO,CAAC,EAAE,WAAW;AAE7B,kBAAI,MAAMA,MAAK,OAAO,CAAC,EAAE,aAAa;AAGtC,uBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC/B,oBAAIE,SAAQF,MAAK,OAAO,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC;AAE5C,oBAAIE,UAASA,OAAM,OAAO;AACxB,kBAAAA,OAAM,MAAM,QAASC,SAAS,OAAOD,OAAM;AAAA,gBAC7C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA,QAKA,MAAM,WAAW;AACf,cAAIA,QAAO,QAAQC;AAGnB,mBAAS,IAAE,GAAG,IAAED,MAAK,OAAO,QAAQ,KAAK;AACvC,YAAAA,MAAK,OAAO,CAAC,EAAE,KAAK;AAAA,UACtB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,QAAQ,WAAW;AACjB,cAAIA,QAAO,QAAQC;AAEnB,mBAAS,IAAED,MAAK,OAAO,SAAO,GAAG,KAAG,GAAG,KAAK;AAC1C,YAAAA,MAAK,OAAO,CAAC,EAAE,OAAO;AAAA,UACxB;AAGA,cAAIA,MAAK,iBAAiBA,MAAK,OAAO,OAAOA,MAAK,IAAI,UAAU,aAAa;AAC3E,YAAAA,MAAK,IAAI,MAAM;AACf,YAAAA,MAAK,MAAM;AACX,8BAAkB;AAAA,UACpB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,QAAQ,SAAS,KAAK;AACpB,kBAAQ,QAAQC,SAAQ,QAAQ,IAAI,QAAQ,OAAO,EAAE,CAAC;AAAA,QACxD;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,QAAQ,WAAW;AACjB,cAAID,QAAO,QAAQC;AAGnB,UAAAD,MAAK,QAAQA,MAAK,MAAMA,MAAK,IAAI,SAAS,cAAc;AAGxD,UAAAA,MAAK,aAAa;AAGlB,cAAI,CAACA,MAAK,eAAe;AAEvB,gBAAI,OAAO,UAAU,aAAa;AAChC,kBAAI;AACF,oBAAI,OAAO,IAAI,MAAM;AAGrB,oBAAI,OAAO,KAAK,qBAAqB,aAAa;AAChD,kBAAAA,MAAK,gBAAgB;AAAA,gBACvB;AAAA,cACF,SAAQ,GAAG;AACT,gBAAAA,MAAK,UAAU;AAAA,cACjB;AAAA,YACF,OAAO;AACL,cAAAA,MAAK,UAAU;AAAA,YACjB;AAAA,UACF;AAGA,cAAI;AACF,gBAAI,OAAO,IAAI,MAAM;AACrB,gBAAI,KAAK,OAAO;AACd,cAAAA,MAAK,UAAU;AAAA,YACjB;AAAA,UACF,SAAS,GAAG;AAAA,UAAC;AAGb,cAAI,CAACA,MAAK,SAAS;AACjB,YAAAA,MAAK,aAAa;AAAA,UACpB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,cAAc,WAAW;AACvB,cAAIA,QAAO,QAAQC;AACnB,cAAI,YAAY;AAGhB,cAAI;AACF,wBAAa,OAAO,UAAU,cAAe,IAAI,MAAM,IAAI;AAAA,UAC7D,SAAS,KAAK;AACZ,mBAAOD;AAAA,UACT;AAEA,cAAI,CAAC,aAAa,OAAO,UAAU,gBAAgB,YAAY;AAC7D,mBAAOA;AAAA,UACT;AAEA,cAAI,WAAW,UAAU,YAAY,aAAa,EAAE,QAAQ,QAAQ,EAAE;AAGtE,cAAII,MAAKJ,MAAK,aAAaA,MAAK,WAAW,YAAY;AACvD,cAAI,aAAaI,IAAG,MAAM,aAAa;AACvC,cAAI,aAAc,cAAc,SAAS,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI;AAC5E,cAAI,cAAcA,IAAG,QAAQ,QAAQ,MAAM,MAAMA,IAAG,QAAQ,QAAQ,MAAM;AAC1E,cAAI,gBAAgBA,IAAG,MAAM,iBAAiB;AAC9C,cAAI,cAAe,eAAe,iBAAiB,SAAS,cAAc,CAAC,GAAG,EAAE,IAAI;AAEpF,UAAAJ,MAAK,UAAU;AAAA,YACb,KAAK,CAAC,EAAE,CAAC,eAAe,YAAY,UAAU,YAAY,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC1F,MAAM,CAAC,CAAC;AAAA,YACR,MAAM,CAAC,CAAC,UAAU,YAAY,0BAA0B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC5E,KAAK,CAAC,CAAC,UAAU,YAAY,4BAA4B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC7E,KAAK,CAAC,CAAC,UAAU,YAAY,4BAA4B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC7E,KAAK,CAAC,EAAE,UAAU,YAAY,uBAAuB,KAAK,UAAU,YAAY,WAAW,GAAG,QAAQ,QAAQ,EAAE;AAAA,YAChH,KAAK,CAAC,CAAC,UAAU,YAAY,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC7D,KAAK,CAAC,CAAC,UAAU,YAAY,cAAc,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC/D,KAAK,CAAC,EAAE,UAAU,YAAY,cAAc,KAAK,UAAU,YAAY,YAAY,KAAK,UAAU,YAAY,YAAY,GAAG,QAAQ,QAAQ,EAAE;AAAA,YAC/I,KAAK,CAAC,EAAE,UAAU,YAAY,cAAc,KAAK,UAAU,YAAY,YAAY,KAAK,UAAU,YAAY,YAAY,GAAG,QAAQ,QAAQ,EAAE;AAAA,YAC/I,KAAK,CAAC,EAAE,UAAU,YAAY,cAAc,KAAK,UAAU,YAAY,YAAY,KAAK,UAAU,YAAY,YAAY,GAAG,QAAQ,QAAQ,EAAE;AAAA,YAC/I,MAAM,CAAC,EAAE,CAAC,eAAe,UAAU,YAAY,6BAA6B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAChG,MAAM,CAAC,EAAE,CAAC,eAAe,UAAU,YAAY,6BAA6B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAChG,OAAO,CAAC,CAAC,UAAU,YAAY,0BAA0B,EAAE,QAAQ,QAAQ,EAAE;AAAA,YAC7E,MAAM,CAAC,EAAE,UAAU,YAAY,eAAe,KAAK,UAAU,YAAY,aAAa,GAAG,QAAQ,QAAQ,EAAE;AAAA,UAC7G;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,cAAc,WAAW;AACvB,cAAIA,QAAO,QAAQC;AAGnB,cAAID,MAAK,kBAAkB,CAACA,MAAK,KAAK;AACpC;AAAA,UACF;AAEA,UAAAA,MAAK,iBAAiB;AACtB,UAAAA,MAAK,aAAa;AAKlB,cAAI,CAACA,MAAK,mBAAmBA,MAAK,IAAI,eAAe,OAAO;AAC1D,YAAAA,MAAK,kBAAkB;AACvB,YAAAA,MAAK,OAAO;AAAA,UACd;AAIA,UAAAA,MAAK,iBAAiBA,MAAK,IAAI,aAAa,GAAG,GAAG,KAAK;AAKvD,cAAI,SAAS,SAAS,GAAG;AAOvB,mBAAOA,MAAK,gBAAgB,SAASA,MAAK,eAAe;AACvD,kBAAI;AACF,oBAAI,YAAY,IAAI,MAAM;AAI1B,0BAAU,YAAY;AAGtB,gBAAAA,MAAK,mBAAmB,SAAS;AAAA,cACnC,SAASK,IAAG;AACV,gBAAAL,MAAK,UAAU;AACf;AAAA,cACF;AAAA,YACF;AAGA,qBAAS,IAAE,GAAG,IAAEA,MAAK,OAAO,QAAQ,KAAK;AACvC,kBAAI,CAACA,MAAK,OAAO,CAAC,EAAE,WAAW;AAE7B,oBAAI,MAAMA,MAAK,OAAO,CAAC,EAAE,aAAa;AAGtC,yBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC/B,sBAAIE,SAAQF,MAAK,OAAO,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC;AAE5C,sBAAIE,UAASA,OAAM,SAAS,CAACA,OAAM,MAAM,WAAW;AAClD,oBAAAA,OAAM,MAAM,YAAY;AACxB,oBAAAA,OAAM,MAAM,KAAK;AAAA,kBACnB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAAF,MAAK,YAAY;AAGjB,gBAAI,SAASA,MAAK,IAAI,mBAAmB;AACzC,mBAAO,SAASA,MAAK;AACrB,mBAAO,QAAQA,MAAK,IAAI,WAAW;AAGnC,gBAAI,OAAO,OAAO,UAAU,aAAa;AACvC,qBAAO,OAAO,CAAC;AAAA,YACjB,OAAO;AACL,qBAAO,MAAM,CAAC;AAAA,YAChB;AAGA,gBAAI,OAAOA,MAAK,IAAI,WAAW,YAAY;AACzC,cAAAA,MAAK,IAAI,OAAO;AAAA,YAClB;AAGA,mBAAO,UAAU,WAAW;AAC1B,qBAAO,WAAW,CAAC;AAGnB,cAAAA,MAAK,iBAAiB;AAGtB,uBAAS,oBAAoB,cAAc,QAAQ,IAAI;AACvD,uBAAS,oBAAoB,YAAY,QAAQ,IAAI;AACrD,uBAAS,oBAAoB,SAAS,QAAQ,IAAI;AAClD,uBAAS,oBAAoB,WAAW,QAAQ,IAAI;AAGpD,uBAASM,KAAE,GAAGA,KAAEN,MAAK,OAAO,QAAQM,MAAK;AACvC,gBAAAN,MAAK,OAAOM,EAAC,EAAE,MAAM,QAAQ;AAAA,cAC/B;AAAA,YACF;AAAA,UACF;AAGA,mBAAS,iBAAiB,cAAc,QAAQ,IAAI;AACpD,mBAAS,iBAAiB,YAAY,QAAQ,IAAI;AAClD,mBAAS,iBAAiB,SAAS,QAAQ,IAAI;AAC/C,mBAAS,iBAAiB,WAAW,QAAQ,IAAI;AAEjD,iBAAON;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,mBAAmB,WAAW;AAC5B,cAAIA,QAAO,QAAQC;AAGnB,cAAID,MAAK,gBAAgB,QAAQ;AAC/B,mBAAOA,MAAK,gBAAgB,IAAI;AAAA,UAClC;AAGA,cAAI,WAAW,IAAI,MAAM,EAAE,KAAK;AAChC,cAAI,YAAY,OAAO,YAAY,gBAAgB,oBAAoB,WAAW,OAAO,SAAS,SAAS,aAAa;AACtH,qBAAS,MAAM,WAAW;AACxB,sBAAQ,KAAK,wEAAwE;AAAA,YACvF,CAAC;AAAA,UACH;AAEA,iBAAO,IAAI,MAAM;AAAA,QACnB;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,oBAAoB,SAAS,OAAO;AAClC,cAAIA,QAAO,QAAQC;AAGnB,cAAI,MAAM,WAAW;AACnB,YAAAD,MAAK,gBAAgB,KAAK,KAAK;AAAA,UACjC;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,cAAc,WAAW;AACvB,cAAIA,QAAO;AAEX,cAAI,CAACA,MAAK,eAAe,CAACA,MAAK,OAAO,OAAOA,MAAK,IAAI,YAAY,eAAe,CAACC,QAAO,eAAe;AACtG;AAAA,UACF;AAGA,mBAAS,IAAE,GAAG,IAAED,MAAK,OAAO,QAAQ,KAAK;AACvC,gBAAIA,MAAK,OAAO,CAAC,EAAE,WAAW;AAC5B,uBAAS,IAAE,GAAG,IAAEA,MAAK,OAAO,CAAC,EAAE,QAAQ,QAAQ,KAAK;AAClD,oBAAI,CAACA,MAAK,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS;AACtC,yBAAOA;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAIA,MAAK,eAAe;AACtB,yBAAaA,MAAK,aAAa;AAAA,UACjC;AAGA,UAAAA,MAAK,gBAAgB,WAAW,WAAW;AACzC,gBAAI,CAACA,MAAK,aAAa;AACrB;AAAA,YACF;AAEA,YAAAA,MAAK,gBAAgB;AACrB,YAAAA,MAAK,QAAQ;AAGb,gBAAI,mBAAmB,WAAW;AAChC,cAAAA,MAAK,QAAQ;AAEb,kBAAIA,MAAK,qBAAqB;AAC5B,uBAAOA,MAAK;AACZ,gBAAAA,MAAK,YAAY;AAAA,cACnB;AAAA,YACF;AAIA,YAAAA,MAAK,IAAI,QAAQ,EAAE,KAAK,kBAAkB,gBAAgB;AAAA,UAC5D,GAAG,GAAK;AAER,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,aAAa,WAAW;AACtB,cAAIA,QAAO;AAEX,cAAI,CAACA,MAAK,OAAO,OAAOA,MAAK,IAAI,WAAW,eAAe,CAACC,QAAO,eAAe;AAChF;AAAA,UACF;AAEA,cAAID,MAAK,UAAU,aAAaA,MAAK,IAAI,UAAU,iBAAiBA,MAAK,eAAe;AACtF,yBAAaA,MAAK,aAAa;AAC/B,YAAAA,MAAK,gBAAgB;AAAA,UACvB,WAAWA,MAAK,UAAU,eAAeA,MAAK,UAAU,aAAaA,MAAK,IAAI,UAAU,eAAe;AACrG,YAAAA,MAAK,IAAI,OAAO,EAAE,KAAK,WAAW;AAChC,cAAAA,MAAK,QAAQ;AAGb,uBAAS,IAAE,GAAG,IAAEA,MAAK,OAAO,QAAQ,KAAK;AACvC,gBAAAA,MAAK,OAAO,CAAC,EAAE,MAAM,QAAQ;AAAA,cAC/B;AAAA,YACF,CAAC;AAED,gBAAIA,MAAK,eAAe;AACtB,2BAAaA,MAAK,aAAa;AAC/B,cAAAA,MAAK,gBAAgB;AAAA,YACvB;AAAA,UACF,WAAWA,MAAK,UAAU,cAAc;AACtC,YAAAA,MAAK,sBAAsB;AAAA,UAC7B;AAEA,iBAAOA;AAAA,QACT;AAAA,MACF;AAGA,UAAIC,UAAS,IAAIF,cAAa;AAS9B,UAAIQ,QAAO,SAAS,GAAG;AACrB,YAAIP,QAAO;AAGX,YAAI,CAAC,EAAE,OAAO,EAAE,IAAI,WAAW,GAAG;AAChC,kBAAQ,MAAM,4DAA4D;AAC1E;AAAA,QACF;AAEA,QAAAA,MAAK,KAAK,CAAC;AAAA,MACb;AACA,MAAAO,MAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMf,MAAM,SAAS,GAAG;AAChB,cAAIP,QAAO;AAGX,cAAI,CAACC,QAAO,KAAK;AACf,8BAAkB;AAAA,UACpB;AAGA,UAAAD,MAAK,YAAY,EAAE,YAAY;AAC/B,UAAAA,MAAK,UAAW,OAAO,EAAE,WAAW,WAAY,EAAE,SAAS,CAAC,EAAE,MAAM;AACpE,UAAAA,MAAK,SAAS,EAAE,SAAS;AACzB,UAAAA,MAAK,SAAS,EAAE,QAAQ;AACxB,UAAAA,MAAK,QAAQ,EAAE,QAAQ;AACvB,UAAAA,MAAK,QAAQ,EAAE,QAAQ;AACvB,UAAAA,MAAK,WAAY,OAAO,EAAE,YAAY,aAAa,EAAE,YAAY,aAAc,EAAE,UAAU;AAC3F,UAAAA,MAAK,QAAQ,EAAE,QAAQ;AACvB,UAAAA,MAAK,UAAU,EAAE,UAAU,CAAC;AAC5B,UAAAA,MAAK,OAAQ,OAAO,EAAE,QAAQ,WAAY,EAAE,MAAM,CAAC,EAAE,GAAG;AACxD,UAAAA,MAAK,UAAU,EAAE,WAAW,SAAY,EAAE,SAAS;AACnD,UAAAA,MAAK,OAAO;AAAA,YACV,QAAQ,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,IAAI,SAAS;AAAA,YAC/C,SAAS,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,IAAI,UAAU;AAAA,YAClD,iBAAiB,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE,IAAI,kBAAkB;AAAA,UAC5E;AAGA,UAAAA,MAAK,YAAY;AACjB,UAAAA,MAAK,SAAS;AACd,UAAAA,MAAK,UAAU,CAAC;AAChB,UAAAA,MAAK,aAAa,CAAC;AACnB,UAAAA,MAAK,SAAS,CAAC;AACf,UAAAA,MAAK,YAAY;AAGjB,UAAAA,MAAK,SAAS,EAAE,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAK,CAAC,IAAI,CAAC;AAC3C,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,eAAe,EAAE,cAAc,CAAC,EAAC,IAAI,EAAE,YAAW,CAAC,IAAI,CAAC;AAC7D,UAAAA,MAAK,eAAe,EAAE,cAAc,CAAC,EAAC,IAAI,EAAE,YAAW,CAAC,IAAI,CAAC;AAC7D,UAAAA,MAAK,WAAW,EAAE,UAAU,CAAC,EAAC,IAAI,EAAE,QAAO,CAAC,IAAI,CAAC;AACjD,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,YAAY,EAAE,WAAW,CAAC,EAAC,IAAI,EAAE,SAAQ,CAAC,IAAI,CAAC;AACpD,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,UAAU,EAAE,SAAS,CAAC,EAAC,IAAI,EAAE,OAAM,CAAC,IAAI,CAAC;AAC9C,UAAAA,MAAK,YAAY,EAAE,WAAW,CAAC,EAAC,IAAI,EAAE,SAAQ,CAAC,IAAI,CAAC;AACpD,UAAAA,MAAK,YAAY,CAAC;AAGlB,UAAAA,MAAK,YAAYC,QAAO,iBAAiB,CAACD,MAAK;AAG/C,cAAI,OAAOC,QAAO,QAAQ,eAAeA,QAAO,OAAOA,QAAO,YAAY;AACxE,YAAAA,QAAO,aAAa;AAAA,UACtB;AAGA,UAAAA,QAAO,OAAO,KAAKD,KAAI;AAGvB,cAAIA,MAAK,WAAW;AAClB,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAK;AAAA,cACZ;AAAA,YACF,CAAC;AAAA,UACH;AAGA,cAAIA,MAAK,YAAYA,MAAK,aAAa,QAAQ;AAC7C,YAAAA,MAAK,KAAK;AAAA,UACZ;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,MAAM,WAAW;AACf,cAAIA,QAAO;AACX,cAAI,MAAM;AAGV,cAAIC,QAAO,SAAS;AAClB,YAAAD,MAAK,MAAM,aAAa,MAAM,mBAAmB;AACjD;AAAA,UACF;AAGA,cAAI,OAAOA,MAAK,SAAS,UAAU;AACjC,YAAAA,MAAK,OAAO,CAACA,MAAK,IAAI;AAAA,UACxB;AAGA,mBAAS,IAAE,GAAG,IAAEA,MAAK,KAAK,QAAQ,KAAK;AACrC,gBAAI,KAAK;AAET,gBAAIA,MAAK,WAAWA,MAAK,QAAQ,CAAC,GAAG;AAEnC,oBAAMA,MAAK,QAAQ,CAAC;AAAA,YACtB,OAAO;AAEL,oBAAMA,MAAK,KAAK,CAAC;AACjB,kBAAI,OAAO,QAAQ,UAAU;AAC3B,gBAAAA,MAAK,MAAM,aAAa,MAAM,wDAAwD;AACtF;AAAA,cACF;AAGA,oBAAM,0BAA0B,KAAK,GAAG;AACxC,kBAAI,CAAC,KAAK;AACR,sBAAM,aAAa,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,cAC9C;AAEA,kBAAI,KAAK;AACP,sBAAM,IAAI,CAAC,EAAE,YAAY;AAAA,cAC3B;AAAA,YACF;AAGA,gBAAI,CAAC,KAAK;AACR,sBAAQ,KAAK,4FAA4F;AAAA,YAC3G;AAGA,gBAAI,OAAOC,QAAO,OAAO,GAAG,GAAG;AAC7B,oBAAMD,MAAK,KAAK,CAAC;AACjB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,KAAK;AACR,YAAAA,MAAK,MAAM,aAAa,MAAM,8CAA8C;AAC5E;AAAA,UACF;AAEA,UAAAA,MAAK,OAAO;AACZ,UAAAA,MAAK,SAAS;AAId,cAAI,OAAO,SAAS,aAAa,YAAY,IAAI,MAAM,GAAG,CAAC,MAAM,SAAS;AACxE,YAAAA,MAAK,SAAS;AACd,YAAAA,MAAK,YAAY;AAAA,UACnB;AAGA,cAAIQ,OAAMR,KAAI;AAGd,cAAIA,MAAK,WAAW;AAClB,uBAAWA,KAAI;AAAA,UACjB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,MAAM,SAAS,QAAQ,UAAU;AAC/B,cAAIA,QAAO;AACX,cAAI,KAAK;AAGT,cAAI,OAAO,WAAW,UAAU;AAC9B,iBAAK;AACL,qBAAS;AAAA,UACX,WAAW,OAAO,WAAW,YAAYA,MAAK,WAAW,YAAY,CAACA,MAAK,QAAQ,MAAM,GAAG;AAE1F,mBAAO;AAAA,UACT,WAAW,OAAO,WAAW,aAAa;AAExC,qBAAS;AAIT,gBAAI,CAACA,MAAK,WAAW;AACnB,kBAAI,MAAM;AACV,uBAAS,IAAE,GAAG,IAAEA,MAAK,QAAQ,QAAQ,KAAK;AACxC,oBAAIA,MAAK,QAAQ,CAAC,EAAE,WAAW,CAACA,MAAK,QAAQ,CAAC,EAAE,QAAQ;AACtD;AACA,uBAAKA,MAAK,QAAQ,CAAC,EAAE;AAAA,gBACvB;AAAA,cACF;AAEA,kBAAI,QAAQ,GAAG;AACb,yBAAS;AAAA,cACX,OAAO;AACL,qBAAK;AAAA,cACP;AAAA,YACF;AAAA,UACF;AAGA,cAAIE,SAAQ,KAAKF,MAAK,WAAW,EAAE,IAAIA,MAAK,eAAe;AAG3D,cAAI,CAACE,QAAO;AACV,mBAAO;AAAA,UACT;AAGA,cAAI,MAAM,CAAC,QAAQ;AACjB,qBAASA,OAAM,WAAW;AAAA,UAC5B;AAKA,cAAIF,MAAK,WAAW,UAAU;AAE5B,YAAAE,OAAM,UAAU;AAGhB,YAAAA,OAAM,SAAS;AAGf,gBAAI,UAAUA,OAAM;AACpB,YAAAF,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAK,OAAO;AAAA,cACnB;AAAA,YACF,CAAC;AAED,mBAAO;AAAA,UACT;AAGA,cAAI,MAAM,CAACE,OAAM,SAAS;AAExB,gBAAI,CAAC,UAAU;AACb,cAAAF,MAAK,WAAW,MAAM;AAAA,YACxB;AAEA,mBAAOE,OAAM;AAAA,UACf;AAGA,cAAIF,MAAK,WAAW;AAClB,YAAAC,QAAO,YAAY;AAAA,UACrB;AAGA,cAAIQ,QAAO,KAAK,IAAI,GAAGP,OAAM,QAAQ,IAAIA,OAAM,QAAQF,MAAK,QAAQ,MAAM,EAAE,CAAC,IAAI,GAAI;AACrF,cAAI,WAAW,KAAK,IAAI,IAAKA,MAAK,QAAQ,MAAM,EAAE,CAAC,IAAIA,MAAK,QAAQ,MAAM,EAAE,CAAC,KAAK,MAAQS,KAAI;AAC9F,cAAI,UAAW,WAAW,MAAQ,KAAK,IAAIP,OAAM,KAAK;AACtD,cAAI,QAAQF,MAAK,QAAQ,MAAM,EAAE,CAAC,IAAI;AACtC,cAAIU,SAAQV,MAAK,QAAQ,MAAM,EAAE,CAAC,IAAIA,MAAK,QAAQ,MAAM,EAAE,CAAC,KAAK;AACjE,UAAAE,OAAM,UAAU;AAIhB,UAAAA,OAAM,SAAS;AAGf,cAAI,YAAY,WAAW;AACzB,YAAAA,OAAM,UAAU;AAChB,YAAAA,OAAM,QAAQO;AACd,YAAAP,OAAM,SAAS;AACf,YAAAA,OAAM,QAAQQ;AACd,YAAAR,OAAM,QAAQ,CAAC,EAAEA,OAAM,SAASF,MAAK,QAAQ,MAAM,EAAE,CAAC;AAAA,UACxD;AAGA,cAAIS,SAAQC,OAAM;AAChB,YAAAV,MAAK,OAAOE,MAAK;AACjB;AAAA,UACF;AAGA,cAAI,OAAOA,OAAM;AACjB,cAAIF,MAAK,WAAW;AAElB,gBAAI,eAAe,WAAW;AAC5B,cAAAA,MAAK,YAAY;AACjB,wBAAU;AACV,cAAAA,MAAK,eAAeE,MAAK;AAGzB,kBAAI,MAAOA,OAAM,UAAUF,MAAK,SAAU,IAAIE,OAAM;AACpD,mBAAK,KAAK,eAAe,KAAKD,QAAO,IAAI,WAAW;AACpD,cAAAC,OAAM,aAAaD,QAAO,IAAI;AAG9B,kBAAI,OAAO,KAAK,aAAa,UAAU,aAAa;AAClD,gBAAAC,OAAM,QAAQ,KAAK,aAAa,YAAY,GAAGO,OAAM,KAAK,IAAI,KAAK,aAAa,YAAY,GAAGA,OAAM,QAAQ;AAAA,cAC/G,OAAO;AACL,gBAAAP,OAAM,QAAQ,KAAK,aAAa,MAAM,GAAGO,OAAM,KAAK,IAAI,KAAK,aAAa,MAAM,GAAGA,OAAM,QAAQ;AAAA,cACnG;AAGA,kBAAI,YAAY,UAAU;AACxB,gBAAAT,MAAK,WAAWE,OAAM,GAAG,IAAI,WAAWF,MAAK,OAAO,KAAKA,OAAME,MAAK,GAAG,OAAO;AAAA,cAChF;AAEA,kBAAI,CAAC,UAAU;AACb,2BAAW,WAAW;AACpB,kBAAAF,MAAK,MAAM,QAAQE,OAAM,GAAG;AAC5B,kBAAAF,MAAK,WAAW;AAAA,gBAClB,GAAG,CAAC;AAAA,cACN;AAAA,YACF;AAEA,gBAAIC,QAAO,UAAU,aAAaA,QAAO,IAAI,UAAU,eAAe;AACpE,2BAAa;AAAA,YACf,OAAO;AACL,cAAAD,MAAK,YAAY;AAGjB,cAAAA,MAAK,KAAK,UAAU,YAAY;AAGhC,cAAAA,MAAK,YAAYE,OAAM,GAAG;AAAA,YAC5B;AAAA,UACF,OAAO;AAEL,gBAAI,YAAY,WAAW;AACzB,mBAAK,cAAcO;AACnB,mBAAK,QAAQP,OAAM,UAAUF,MAAK,UAAUC,QAAO,UAAU,KAAK;AAClE,mBAAK,SAASC,OAAM,UAAUD,QAAO,OAAO;AAC5C,mBAAK,eAAeC,OAAM;AAG1B,kBAAI;AACF,oBAAIS,QAAO,KAAK,KAAK;AAGrB,oBAAIA,SAAQ,OAAO,YAAY,gBAAgBA,iBAAgB,WAAW,OAAOA,MAAK,SAAS,aAAa;AAE1G,kBAAAX,MAAK,YAAY;AAGjB,4BAAU;AAGV,kBAAAW,MACG,KAAK,WAAW;AACf,oBAAAX,MAAK,YAAY;AACjB,yBAAK,YAAY;AACjB,wBAAI,CAAC,UAAU;AACb,sBAAAA,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,oBAC9B,OAAO;AACL,sBAAAF,MAAK,WAAW;AAAA,oBAClB;AAAA,kBACF,CAAC,EACA,MAAM,WAAW;AAChB,oBAAAA,MAAK,YAAY;AACjB,oBAAAA,MAAK,MAAM,aAAaE,OAAM,KAAK,6IAC+C;AAGlF,oBAAAA,OAAM,SAAS;AACf,oBAAAA,OAAM,UAAU;AAAA,kBAClB,CAAC;AAAA,gBACL,WAAW,CAAC,UAAU;AACpB,kBAAAF,MAAK,YAAY;AACjB,4BAAU;AACV,kBAAAA,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,gBAC9B;AAGA,qBAAK,eAAeA,OAAM;AAG1B,oBAAI,KAAK,QAAQ;AACf,kBAAAF,MAAK,MAAM,aAAaE,OAAM,KAAK,6IAC+C;AAClF;AAAA,gBACF;AAGA,oBAAI,WAAW,eAAeA,OAAM,OAAO;AACzC,kBAAAF,MAAK,WAAWE,OAAM,GAAG,IAAI,WAAWF,MAAK,OAAO,KAAKA,OAAME,MAAK,GAAG,OAAO;AAAA,gBAChF,OAAO;AACL,kBAAAF,MAAK,WAAWE,OAAM,GAAG,IAAI,WAAW;AAEtC,oBAAAF,MAAK,OAAOE,MAAK;AAGjB,yBAAK,oBAAoB,SAASF,MAAK,WAAWE,OAAM,GAAG,GAAG,KAAK;AAAA,kBACrE;AACA,uBAAK,iBAAiB,SAASF,MAAK,WAAWE,OAAM,GAAG,GAAG,KAAK;AAAA,gBAClE;AAAA,cACF,SAAS,KAAK;AACZ,gBAAAF,MAAK,MAAM,aAAaE,OAAM,KAAK,GAAG;AAAA,cACxC;AAAA,YACF;AAGA,gBAAI,KAAK,QAAQ,0FAA0F;AACzG,mBAAK,MAAMF,MAAK;AAChB,mBAAK,KAAK;AAAA,YACZ;AAGA,gBAAI,qBAAsB,UAAU,OAAO,UAAY,CAAC,KAAK,cAAcC,QAAO,WAAW;AAC7F,gBAAI,KAAK,cAAc,KAAK,oBAAoB;AAC9C,wBAAU;AAAA,YACZ,OAAO;AACL,cAAAD,MAAK,YAAY;AACjB,cAAAA,MAAK,SAAS;AAEd,kBAAI,WAAW,WAAW;AACxB,gBAAAA,MAAK,SAAS;AAGd,0BAAU;AAGV,qBAAK,oBAAoBC,QAAO,eAAe,UAAU,KAAK;AAAA,cAChE;AACA,mBAAK,iBAAiBA,QAAO,eAAe,UAAU,KAAK;AAG3D,cAAAD,MAAK,YAAYE,OAAM,GAAG;AAAA,YAC5B;AAAA,UACF;AAEA,iBAAOA,OAAM;AAAA,QACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,OAAO,SAAS,IAAI;AAClB,cAAIF,QAAO;AAGX,cAAIA,MAAK,WAAW,YAAYA,MAAK,WAAW;AAC9C,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,MAAM,EAAE;AAAA,cACf;AAAA,YACF,CAAC;AAED,mBAAOA;AAAA,UACT;AAGA,cAAI,MAAMA,MAAK,aAAa,EAAE;AAE9B,mBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,YAAAA,MAAK,YAAY,IAAI,CAAC,CAAC;AAGvB,gBAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,gBAAIE,UAAS,CAACA,OAAM,SAAS;AAE3B,cAAAA,OAAM,QAAQF,MAAK,KAAK,IAAI,CAAC,CAAC;AAC9B,cAAAE,OAAM,YAAY;AAClB,cAAAA,OAAM,UAAU;AAGhB,cAAAF,MAAK,UAAU,IAAI,CAAC,CAAC;AAErB,kBAAIE,OAAM,OAAO;AACf,oBAAIF,MAAK,WAAW;AAElB,sBAAI,CAACE,OAAM,MAAM,cAAc;AAC7B;AAAA,kBACF;AAEA,sBAAI,OAAOA,OAAM,MAAM,aAAa,SAAS,aAAa;AACxD,oBAAAA,OAAM,MAAM,aAAa,QAAQ,CAAC;AAAA,kBACpC,OAAO;AACL,oBAAAA,OAAM,MAAM,aAAa,KAAK,CAAC;AAAA,kBACjC;AAGA,kBAAAF,MAAK,aAAaE,OAAM,KAAK;AAAA,gBAC/B,WAAW,CAAC,MAAMA,OAAM,MAAM,QAAQ,KAAKA,OAAM,MAAM,aAAa,UAAU;AAC5E,kBAAAA,OAAM,MAAM,MAAM;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAGA,gBAAI,CAAC,UAAU,CAAC,GAAG;AACjB,cAAAF,MAAK,MAAM,SAASE,SAAQA,OAAM,MAAM,IAAI;AAAA,YAC9C;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,MAAM,SAAS,IAAI,UAAU;AAC3B,cAAIA,QAAO;AAGX,cAAIA,MAAK,WAAW,YAAYA,MAAK,WAAW;AAC9C,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAK,EAAE;AAAA,cACd;AAAA,YACF,CAAC;AAED,mBAAOA;AAAA,UACT;AAGA,cAAI,MAAMA,MAAK,aAAa,EAAE;AAE9B,mBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,YAAAA,MAAK,YAAY,IAAI,CAAC,CAAC;AAGvB,gBAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,gBAAIE,QAAO;AAET,cAAAA,OAAM,QAAQA,OAAM,UAAU;AAC9B,cAAAA,OAAM,YAAY;AAClB,cAAAA,OAAM,UAAU;AAChB,cAAAA,OAAM,SAAS;AAGf,cAAAF,MAAK,UAAU,IAAI,CAAC,CAAC;AAErB,kBAAIE,OAAM,OAAO;AACf,oBAAIF,MAAK,WAAW;AAElB,sBAAIE,OAAM,MAAM,cAAc;AAC5B,wBAAI,OAAOA,OAAM,MAAM,aAAa,SAAS,aAAa;AACxD,sBAAAA,OAAM,MAAM,aAAa,QAAQ,CAAC;AAAA,oBACpC,OAAO;AACL,sBAAAA,OAAM,MAAM,aAAa,KAAK,CAAC;AAAA,oBACjC;AAGA,oBAAAF,MAAK,aAAaE,OAAM,KAAK;AAAA,kBAC/B;AAAA,gBACF,WAAW,CAAC,MAAMA,OAAM,MAAM,QAAQ,KAAKA,OAAM,MAAM,aAAa,UAAU;AAC5E,kBAAAA,OAAM,MAAM,cAAcA,OAAM,UAAU;AAC1C,kBAAAA,OAAM,MAAM,MAAM;AAGlB,sBAAIA,OAAM,MAAM,aAAa,UAAU;AACrC,oBAAAF,MAAK,YAAYE,OAAM,KAAK;AAAA,kBAC9B;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI,CAAC,UAAU;AACb,gBAAAF,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,cAC9B;AAAA,YACF;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,MAAM,SAASG,QAAO,IAAI;AACxB,cAAIH,QAAO;AAGX,cAAIA,MAAK,WAAW,YAAWA,MAAK,WAAW;AAC7C,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAKG,QAAO,EAAE;AAAA,cACrB;AAAA,YACF,CAAC;AAED,mBAAOH;AAAA,UACT;AAGA,cAAI,OAAO,OAAO,aAAa;AAC7B,gBAAI,OAAOG,WAAU,WAAW;AAC9B,cAAAH,MAAK,SAASG;AAAA,YAChB,OAAO;AACL,qBAAOH,MAAK;AAAA,YACd;AAAA,UACF;AAGA,cAAI,MAAMA,MAAK,aAAa,EAAE;AAE9B,mBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,gBAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,gBAAIE,QAAO;AACT,cAAAA,OAAM,SAASC;AAGf,kBAAID,OAAM,WAAW;AACnB,gBAAAF,MAAK,UAAUE,OAAM,GAAG;AAAA,cAC1B;AAEA,kBAAIF,MAAK,aAAaE,OAAM,OAAO;AACjC,gBAAAA,OAAM,MAAM,KAAK,eAAeC,SAAQ,IAAID,OAAM,SAASD,QAAO,IAAI,WAAW;AAAA,cACnF,WAAWC,OAAM,OAAO;AACtB,gBAAAA,OAAM,MAAM,QAAQD,QAAO,SAAS,OAAOE;AAAA,cAC7C;AAEA,cAAAH,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,YAC9B;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,QAAQ,WAAW;AACjB,cAAIA,QAAO;AACX,cAAI,OAAO;AACX,cAAI,KAAK;AAGT,cAAI,KAAK,WAAW,GAAG;AAErB,mBAAOA,MAAK;AAAA,UACd,WAAW,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,OAAO,KAAK,CAAC,MAAM,aAAa;AAEnF,gBAAI,MAAMA,MAAK,aAAa;AAC5B,gBAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC/B,gBAAI,SAAS,GAAG;AACd,mBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,YAC3B,OAAO;AACL,oBAAM,WAAW,KAAK,CAAC,CAAC;AAAA,YAC1B;AAAA,UACF,WAAW,KAAK,UAAU,GAAG;AAC3B,kBAAM,WAAW,KAAK,CAAC,CAAC;AACxB,iBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,UAC3B;AAGA,cAAIE;AACJ,cAAI,OAAO,QAAQ,eAAe,OAAO,KAAK,OAAO,GAAG;AAEtD,gBAAIF,MAAK,WAAW,YAAWA,MAAK,WAAW;AAC7C,cAAAA,MAAK,OAAO,KAAK;AAAA,gBACf,OAAO;AAAA,gBACP,QAAQ,WAAW;AACjB,kBAAAA,MAAK,OAAO,MAAMA,OAAM,IAAI;AAAA,gBAC9B;AAAA,cACF,CAAC;AAED,qBAAOA;AAAA,YACT;AAGA,gBAAI,OAAO,OAAO,aAAa;AAC7B,cAAAA,MAAK,UAAU;AAAA,YACjB;AAGA,iBAAKA,MAAK,aAAa,EAAE;AACzB,qBAAS,IAAE,GAAG,IAAE,GAAG,QAAQ,KAAK;AAE9B,cAAAE,SAAQF,MAAK,WAAW,GAAG,CAAC,CAAC;AAE7B,kBAAIE,QAAO;AACT,gBAAAA,OAAM,UAAU;AAGhB,oBAAI,CAAC,KAAK,CAAC,GAAG;AACZ,kBAAAF,MAAK,UAAU,GAAG,CAAC,CAAC;AAAA,gBACtB;AAEA,oBAAIA,MAAK,aAAaE,OAAM,SAAS,CAACA,OAAM,QAAQ;AAClD,kBAAAA,OAAM,MAAM,KAAK,eAAe,KAAKD,QAAO,IAAI,WAAW;AAAA,gBAC7D,WAAWC,OAAM,SAAS,CAACA,OAAM,QAAQ;AACvC,kBAAAA,OAAM,MAAM,SAAS,MAAMD,QAAO,OAAO;AAAA,gBAC3C;AAEA,gBAAAD,MAAK,MAAM,UAAUE,OAAM,GAAG;AAAA,cAChC;AAAA,YACF;AAAA,UACF,OAAO;AACL,YAAAA,SAAQ,KAAKF,MAAK,WAAW,EAAE,IAAIA,MAAK,QAAQ,CAAC;AACjD,mBAAOE,SAAQA,OAAM,UAAU;AAAA,UACjC;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,MAAM,SAAS,MAAM,IAAI,KAAK,IAAI;AAChC,cAAIA,QAAO;AAGX,cAAIA,MAAK,WAAW,YAAYA,MAAK,WAAW;AAC9C,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAK,MAAM,IAAI,KAAK,EAAE;AAAA,cAC7B;AAAA,YACF,CAAC;AAED,mBAAOA;AAAA,UACT;AAGA,iBAAO,KAAK,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,GAAG,CAAC;AAChD,eAAK,KAAK,IAAI,KAAK,IAAI,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC;AAC5C,gBAAM,WAAW,GAAG;AAGpB,UAAAA,MAAK,OAAO,MAAM,EAAE;AAGpB,cAAI,MAAMA,MAAK,aAAa,EAAE;AAC9B,mBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,gBAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAGlC,gBAAIE,QAAO;AAET,kBAAI,CAAC,IAAI;AACP,gBAAAF,MAAK,UAAU,IAAI,CAAC,CAAC;AAAA,cACvB;AAGA,kBAAIA,MAAK,aAAa,CAACE,OAAM,QAAQ;AACnC,oBAAI,cAAcD,QAAO,IAAI;AAC7B,oBAAI,MAAM,cAAe,MAAM;AAC/B,gBAAAC,OAAM,UAAU;AAChB,gBAAAA,OAAM,MAAM,KAAK,eAAe,MAAM,WAAW;AACjD,gBAAAA,OAAM,MAAM,KAAK,wBAAwB,IAAI,GAAG;AAAA,cAClD;AAEA,cAAAF,MAAK,mBAAmBE,QAAO,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,OAAO,WAAW;AAAA,YACjF;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWA,oBAAoB,SAASE,QAAO,MAAM,IAAI,KAAK,IAAI,SAAS;AAC9D,cAAIF,QAAO;AACX,cAAI,MAAM;AACV,cAAI,OAAO,KAAK;AAChB,cAAI,QAAQ,KAAK,IAAI,OAAO,IAAI;AAChC,cAAI,UAAU,KAAK,IAAI,GAAI,QAAQ,IAAK,MAAM,QAAQ,GAAG;AACzD,cAAI,WAAW,KAAK,IAAI;AAGxB,UAAAE,OAAM,UAAU;AAGhB,UAAAA,OAAM,YAAY,YAAY,WAAW;AAEvC,gBAAI,QAAQ,KAAK,IAAI,IAAI,YAAY;AACrC,uBAAW,KAAK,IAAI;AACpB,mBAAO,OAAO;AAGd,kBAAM,KAAK,MAAM,MAAM,GAAG,IAAI;AAG9B,gBAAI,OAAO,GAAG;AACZ,oBAAM,KAAK,IAAI,IAAI,GAAG;AAAA,YACxB,OAAO;AACL,oBAAM,KAAK,IAAI,IAAI,GAAG;AAAA,YACxB;AAGA,gBAAIF,MAAK,WAAW;AAClB,cAAAE,OAAM,UAAU;AAAA,YAClB,OAAO;AACL,cAAAF,MAAK,OAAO,KAAKE,OAAM,KAAK,IAAI;AAAA,YAClC;AAGA,gBAAI,SAAS;AACX,cAAAF,MAAK,UAAU;AAAA,YACjB;AAGA,gBAAK,KAAK,QAAQ,OAAO,MAAQ,KAAK,QAAQ,OAAO,IAAK;AACxD,4BAAcE,OAAM,SAAS;AAC7B,cAAAA,OAAM,YAAY;AAClB,cAAAA,OAAM,UAAU;AAChB,cAAAF,MAAK,OAAO,IAAIE,OAAM,GAAG;AACzB,cAAAF,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,YAC9B;AAAA,UACF,GAAG,OAAO;AAAA,QACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,WAAW,SAAS,IAAI;AACtB,cAAIF,QAAO;AACX,cAAIE,SAAQF,MAAK,WAAW,EAAE;AAE9B,cAAIE,UAASA,OAAM,WAAW;AAC5B,gBAAIF,MAAK,WAAW;AAClB,cAAAE,OAAM,MAAM,KAAK,sBAAsBD,QAAO,IAAI,WAAW;AAAA,YAC/D;AAEA,0BAAcC,OAAM,SAAS;AAC7B,YAAAA,OAAM,YAAY;AAClB,YAAAF,MAAK,OAAOE,OAAM,SAAS,EAAE;AAC7B,YAAAA,OAAM,UAAU;AAChB,YAAAF,MAAK,MAAM,QAAQ,EAAE;AAAA,UACvB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,MAAM,WAAW;AACf,cAAIA,QAAO;AACX,cAAI,OAAO;AACX,cAAI,MAAM,IAAIE;AAGd,cAAI,KAAK,WAAW,GAAG;AAErB,mBAAOF,MAAK;AAAA,UACd,WAAW,KAAK,WAAW,GAAG;AAC5B,gBAAI,OAAO,KAAK,CAAC,MAAM,WAAW;AAChC,qBAAO,KAAK,CAAC;AACb,cAAAA,MAAK,QAAQ;AAAA,YACf,OAAO;AAEL,cAAAE,SAAQF,MAAK,WAAW,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAC7C,qBAAOE,SAAQA,OAAM,QAAQ;AAAA,YAC/B;AAAA,UACF,WAAW,KAAK,WAAW,GAAG;AAC5B,mBAAO,KAAK,CAAC;AACb,iBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,UAC3B;AAGA,cAAI,MAAMF,MAAK,aAAa,EAAE;AAC9B,mBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC/B,YAAAE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAE9B,gBAAIE,QAAO;AACT,cAAAA,OAAM,QAAQ;AACd,kBAAIF,MAAK,aAAaE,OAAM,SAASA,OAAM,MAAM,cAAc;AAC7D,gBAAAA,OAAM,MAAM,aAAa,OAAO;AAChC,oBAAI,MAAM;AACR,kBAAAA,OAAM,MAAM,aAAa,YAAYA,OAAM,UAAU;AACrD,kBAAAA,OAAM,MAAM,aAAa,UAAUA,OAAM;AAGzC,sBAAIF,MAAK,QAAQ,IAAI,CAAC,CAAC,GAAG;AACxB,oBAAAA,MAAK,MAAM,IAAI,CAAC,GAAG,IAAI;AACvB,oBAAAA,MAAK,KAAK,IAAI,CAAC,GAAG,IAAI;AAAA,kBACxB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,MAAM,WAAW;AACf,cAAIA,QAAO;AACX,cAAI,OAAO;AACX,cAAIY,OAAM;AAGV,cAAI,KAAK,WAAW,GAAG;AAErB,iBAAKZ,MAAK,QAAQ,CAAC,EAAE;AAAA,UACvB,WAAW,KAAK,WAAW,GAAG;AAE5B,gBAAI,MAAMA,MAAK,aAAa;AAC5B,gBAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC/B,gBAAI,SAAS,GAAG;AACd,mBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,YAC3B,OAAO;AACL,cAAAY,QAAO,WAAW,KAAK,CAAC,CAAC;AAAA,YAC3B;AAAA,UACF,WAAW,KAAK,WAAW,GAAG;AAC5B,YAAAA,QAAO,WAAW,KAAK,CAAC,CAAC;AACzB,iBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,UAC3B;AAGA,cAAIV;AACJ,cAAI,OAAOU,UAAS,UAAU;AAE5B,gBAAIZ,MAAK,WAAW,YAAYA,MAAK,WAAW;AAC9C,cAAAA,MAAK,OAAO,KAAK;AAAA,gBACf,OAAO;AAAA,gBACP,QAAQ,WAAW;AACjB,kBAAAA,MAAK,KAAK,MAAMA,OAAM,IAAI;AAAA,gBAC5B;AAAA,cACF,CAAC;AAED,qBAAOA;AAAA,YACT;AAGA,gBAAI,OAAO,OAAO,aAAa;AAC7B,cAAAA,MAAK,QAAQY;AAAA,YACf;AAGA,iBAAKZ,MAAK,aAAa,EAAE;AACzB,qBAAS,IAAE,GAAG,IAAE,GAAG,QAAQ,KAAK;AAE9B,cAAAE,SAAQF,MAAK,WAAW,GAAG,CAAC,CAAC;AAE7B,kBAAIE,QAAO;AAGT,oBAAIF,MAAK,QAAQ,GAAG,CAAC,CAAC,GAAG;AACvB,kBAAAE,OAAM,YAAYF,MAAK,KAAK,GAAG,CAAC,CAAC;AACjC,kBAAAE,OAAM,aAAaF,MAAK,YAAYC,QAAO,IAAI,cAAcC,OAAM;AAAA,gBACrE;AACA,gBAAAA,OAAM,QAAQU;AAGd,oBAAIZ,MAAK,aAAaE,OAAM,SAASA,OAAM,MAAM,cAAc;AAC7D,kBAAAA,OAAM,MAAM,aAAa,aAAa,eAAeU,OAAMX,QAAO,IAAI,WAAW;AAAA,gBACnF,WAAWC,OAAM,OAAO;AACtB,kBAAAA,OAAM,MAAM,eAAeU;AAAA,gBAC7B;AAGA,oBAAIH,QAAOT,MAAK,KAAK,GAAG,CAAC,CAAC;AAC1B,oBAAI,YAAaA,MAAK,QAAQE,OAAM,OAAO,EAAE,CAAC,IAAIF,MAAK,QAAQE,OAAM,OAAO,EAAE,CAAC,KAAK,MAAQO;AAC5F,oBAAI,UAAW,WAAW,MAAQ,KAAK,IAAIP,OAAM,KAAK;AAGtD,oBAAIF,MAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAACE,OAAM,SAAS;AAC5C,kBAAAF,MAAK,YAAY,GAAG,CAAC,CAAC;AACtB,kBAAAA,MAAK,WAAW,GAAG,CAAC,CAAC,IAAI,WAAWA,MAAK,OAAO,KAAKA,OAAME,MAAK,GAAG,OAAO;AAAA,gBAC5E;AAEA,gBAAAF,MAAK,MAAM,QAAQE,OAAM,GAAG;AAAA,cAC9B;AAAA,YACF;AAAA,UACF,OAAO;AACL,YAAAA,SAAQF,MAAK,WAAW,EAAE;AAC1B,mBAAOE,SAAQA,OAAM,QAAQF,MAAK;AAAA,UACpC;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,MAAM,WAAW;AACf,cAAIA,QAAO;AACX,cAAI,OAAO;AACX,cAAIS,OAAM;AAGV,cAAI,KAAK,WAAW,GAAG;AAErB,gBAAIT,MAAK,QAAQ,QAAQ;AACvB,mBAAKA,MAAK,QAAQ,CAAC,EAAE;AAAA,YACvB;AAAA,UACF,WAAW,KAAK,WAAW,GAAG;AAE5B,gBAAI,MAAMA,MAAK,aAAa;AAC5B,gBAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC/B,gBAAI,SAAS,GAAG;AACd,mBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,YAC3B,WAAWA,MAAK,QAAQ,QAAQ;AAC9B,mBAAKA,MAAK,QAAQ,CAAC,EAAE;AACrB,cAAAS,QAAO,WAAW,KAAK,CAAC,CAAC;AAAA,YAC3B;AAAA,UACF,WAAW,KAAK,WAAW,GAAG;AAC5B,YAAAA,QAAO,WAAW,KAAK,CAAC,CAAC;AACzB,iBAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,UAC3B;AAGA,cAAI,OAAO,OAAO,aAAa;AAC7B,mBAAO;AAAA,UACT;AAGA,cAAI,OAAOA,UAAS,aAAaT,MAAK,WAAW,YAAYA,MAAK,YAAY;AAC5E,YAAAA,MAAK,OAAO,KAAK;AAAA,cACf,OAAO;AAAA,cACP,QAAQ,WAAW;AACjB,gBAAAA,MAAK,KAAK,MAAMA,OAAM,IAAI;AAAA,cAC5B;AAAA,YACF,CAAC;AAED,mBAAOA;AAAA,UACT;AAGA,cAAIE,SAAQF,MAAK,WAAW,EAAE;AAE9B,cAAIE,QAAO;AACT,gBAAI,OAAOO,UAAS,YAAYA,SAAQ,GAAG;AAEzC,kBAAI,UAAUT,MAAK,QAAQ,EAAE;AAC7B,kBAAI,SAAS;AACX,gBAAAA,MAAK,MAAM,IAAI,IAAI;AAAA,cACrB;AAGA,cAAAE,OAAM,QAAQO;AACd,cAAAP,OAAM,SAAS;AACf,cAAAF,MAAK,YAAY,EAAE;AAGnB,kBAAI,CAACA,MAAK,aAAaE,OAAM,SAAS,CAAC,MAAMA,OAAM,MAAM,QAAQ,GAAG;AAClE,gBAAAA,OAAM,MAAM,cAAcO;AAAA,cAC5B;AAGA,kBAAI,cAAc,WAAW;AAE3B,oBAAI,SAAS;AACX,kBAAAT,MAAK,KAAK,IAAI,IAAI;AAAA,gBACpB;AAEA,gBAAAA,MAAK,MAAM,QAAQ,EAAE;AAAA,cACvB;AAGA,kBAAI,WAAW,CAACA,MAAK,WAAW;AAC9B,oBAAI,WAAW,WAAW;AACxB,sBAAI,CAACA,MAAK,WAAW;AACnB,gCAAY;AAAA,kBACd,OAAO;AACL,+BAAW,UAAU,CAAC;AAAA,kBACxB;AAAA,gBACF;AACA,2BAAW,UAAU,CAAC;AAAA,cACxB,OAAO;AACL,4BAAY;AAAA,cACd;AAAA,YACF,OAAO;AACL,kBAAIA,MAAK,WAAW;AAClB,oBAAI,WAAWA,MAAK,QAAQ,EAAE,IAAIC,QAAO,IAAI,cAAcC,OAAM,aAAa;AAC9E,oBAAI,WAAWA,OAAM,YAAYA,OAAM,YAAYA,OAAM,QAAQ;AACjE,uBAAOA,OAAM,SAAS,WAAW,WAAW,KAAK,IAAIA,OAAM,KAAK;AAAA,cAClE,OAAO;AACL,uBAAOA,OAAM,MAAM;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,SAAS,SAAS,IAAI;AACpB,cAAIA,QAAO;AAGX,cAAI,OAAO,OAAO,UAAU;AAC1B,gBAAIE,SAAQF,MAAK,WAAW,EAAE;AAC9B,mBAAOE,SAAQ,CAACA,OAAM,UAAU;AAAA,UAClC;AAGA,mBAAS,IAAE,GAAG,IAAEF,MAAK,QAAQ,QAAQ,KAAK;AACxC,gBAAI,CAACA,MAAK,QAAQ,CAAC,EAAE,SAAS;AAC5B,qBAAO;AAAA,YACT;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,UAAU,SAAS,IAAI;AACrB,cAAIA,QAAO;AACX,cAAI,WAAWA,MAAK;AAGpB,cAAIE,SAAQF,MAAK,WAAW,EAAE;AAC9B,cAAIE,QAAO;AACT,uBAAWF,MAAK,QAAQE,OAAM,OAAO,EAAE,CAAC,IAAI;AAAA,UAC9C;AAEA,iBAAO;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,OAAO,WAAW;AAChB,iBAAO,KAAK;AAAA,QACd;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,QAAQ,WAAW;AACjB,cAAIF,QAAO;AAGX,cAAI,SAASA,MAAK;AAClB,mBAAS,IAAE,GAAG,IAAE,OAAO,QAAQ,KAAK;AAElC,gBAAI,CAAC,OAAO,CAAC,EAAE,SAAS;AACtB,cAAAA,MAAK,KAAK,OAAO,CAAC,EAAE,GAAG;AAAA,YACzB;AAGA,gBAAI,CAACA,MAAK,WAAW;AAEnB,cAAAA,MAAK,YAAY,OAAO,CAAC,EAAE,KAAK;AAGhC,qBAAO,CAAC,EAAE,MAAM,oBAAoB,SAAS,OAAO,CAAC,EAAE,UAAU,KAAK;AACtE,qBAAO,CAAC,EAAE,MAAM,oBAAoBC,QAAO,eAAe,OAAO,CAAC,EAAE,SAAS,KAAK;AAClF,qBAAO,CAAC,EAAE,MAAM,oBAAoB,SAAS,OAAO,CAAC,EAAE,QAAQ,KAAK;AAGpE,cAAAA,QAAO,mBAAmB,OAAO,CAAC,EAAE,KAAK;AAAA,YAC3C;AAGA,mBAAO,OAAO,CAAC,EAAE;AAGjB,YAAAD,MAAK,YAAY,OAAO,CAAC,EAAE,GAAG;AAAA,UAChC;AAGA,cAAI,QAAQC,QAAO,OAAO,QAAQD,KAAI;AACtC,cAAI,SAAS,GAAG;AACd,YAAAC,QAAO,OAAO,OAAO,OAAO,CAAC;AAAA,UAC/B;AAGA,cAAI,WAAW;AACf,eAAK,IAAE,GAAG,IAAEA,QAAO,OAAO,QAAQ,KAAK;AACrC,gBAAIA,QAAO,OAAO,CAAC,EAAE,SAASD,MAAK,QAAQA,MAAK,KAAK,QAAQC,QAAO,OAAO,CAAC,EAAE,IAAI,KAAK,GAAG;AACxF,yBAAW;AACX;AAAA,YACF;AAAA,UACF;AAEA,cAAIY,UAAS,UAAU;AACrB,mBAAOA,OAAMb,MAAK,IAAI;AAAA,UACxB;AAGA,UAAAC,QAAO,UAAU;AAGjB,UAAAD,MAAK,SAAS;AACd,UAAAA,MAAK,UAAU,CAAC;AAChB,UAAAA,QAAO;AAEP,iBAAO;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUA,IAAI,SAAS,OAAO,IAAI,IAAIc,OAAM;AAChC,cAAId,QAAO;AACX,cAAI,SAASA,MAAK,QAAQ,KAAK;AAE/B,cAAI,OAAO,OAAO,YAAY;AAC5B,mBAAO,KAAKc,QAAO,EAAC,IAAQ,IAAQ,MAAMA,MAAI,IAAI,EAAC,IAAQ,GAAM,CAAC;AAAA,UACpE;AAEA,iBAAOd;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,KAAK,SAAS,OAAO,IAAI,IAAI;AAC3B,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK,QAAQ,KAAK;AAC/B,cAAI,IAAI;AAGR,cAAI,OAAO,OAAO,UAAU;AAC1B,iBAAK;AACL,iBAAK;AAAA,UACP;AAEA,cAAI,MAAM,IAAI;AAEZ,iBAAK,IAAE,GAAG,IAAE,OAAO,QAAQ,KAAK;AAC9B,kBAAI,OAAQ,OAAO,OAAO,CAAC,EAAE;AAC7B,kBAAI,OAAO,OAAO,CAAC,EAAE,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC9C,uBAAO,OAAO,GAAG,CAAC;AAClB;AAAA,cACF;AAAA,YACF;AAAA,UACF,WAAW,OAAO;AAEhB,YAAAA,MAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,UACzB,OAAO;AAEL,gBAAI,OAAO,OAAO,KAAKA,KAAI;AAC3B,iBAAK,IAAE,GAAG,IAAE,KAAK,QAAQ,KAAK;AAC5B,kBAAK,KAAK,CAAC,EAAE,QAAQ,KAAK,MAAM,KAAM,MAAM,QAAQA,MAAK,KAAK,CAAC,CAAC,CAAC,GAAG;AAClE,gBAAAA,MAAK,KAAK,CAAC,CAAC,IAAI,CAAC;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,MAAM,SAAS,OAAO,IAAI,IAAI;AAC5B,cAAIA,QAAO;AAGX,UAAAA,MAAK,GAAG,OAAO,IAAI,IAAI,CAAC;AAExB,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,OAAO,SAAS,OAAO,IAAI,KAAK;AAC9B,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK,QAAQ,KAAK;AAG/B,mBAAS,IAAE,OAAO,SAAO,GAAG,KAAG,GAAG,KAAK;AAErC,gBAAI,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,OAAO,MAAM,UAAU,QAAQ;AAC5D,yBAAW,SAAS,IAAI;AACtB,mBAAG,KAAK,MAAM,IAAI,GAAG;AAAA,cACvB,EAAE,KAAKA,OAAM,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;AAG7B,kBAAI,OAAO,CAAC,EAAE,MAAM;AAClB,gBAAAA,MAAK,IAAI,OAAO,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,EAAE;AAAA,cAC5C;AAAA,YACF;AAAA,UACF;AAGA,UAAAA,MAAK,WAAW,KAAK;AAErB,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA,YAAY,SAAS,OAAO;AAC1B,cAAIA,QAAO;AAEX,cAAIA,MAAK,OAAO,SAAS,GAAG;AAC1B,gBAAI,OAAOA,MAAK,OAAO,CAAC;AAGxB,gBAAI,KAAK,UAAU,OAAO;AACxB,cAAAA,MAAK,OAAO,MAAM;AAClB,cAAAA,MAAK,WAAW;AAAA,YAClB;AAGA,gBAAI,CAAC,OAAO;AACV,mBAAK,OAAO;AAAA,YACd;AAAA,UACF;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,QAAQ,SAASE,QAAO;AACtB,cAAIF,QAAO;AACX,cAAI,SAASE,OAAM;AAKnB,cAAI,CAACF,MAAK,aAAaE,OAAM,SAAS,CAACA,OAAM,MAAM,UAAU,CAACA,OAAM,MAAM,SAASA,OAAM,MAAM,cAAcA,OAAM,OAAO;AACxH,uBAAWF,MAAK,OAAO,KAAKA,OAAME,MAAK,GAAG,GAAG;AAC7C,mBAAOF;AAAA,UACT;AAGA,cAAI,OAAO,CAAC,EAAEE,OAAM,SAASF,MAAK,QAAQ,MAAM,EAAE,CAAC;AAGnD,UAAAA,MAAK,MAAM,OAAOE,OAAM,GAAG;AAG3B,cAAI,CAACF,MAAK,aAAa,MAAM;AAC3B,YAAAA,MAAK,KAAKE,OAAM,KAAK,IAAI,EAAE,KAAKA,OAAM,GAAG;AAAA,UAC3C;AAGA,cAAIF,MAAK,aAAa,MAAM;AAC1B,YAAAA,MAAK,MAAM,QAAQE,OAAM,GAAG;AAC5B,YAAAA,OAAM,QAAQA,OAAM,UAAU;AAC9B,YAAAA,OAAM,YAAY;AAClB,YAAAA,OAAM,aAAaD,QAAO,IAAI;AAE9B,gBAAI,WAAYC,OAAM,QAAQA,OAAM,UAAU,MAAQ,KAAK,IAAIA,OAAM,KAAK;AAC1E,YAAAF,MAAK,WAAWE,OAAM,GAAG,IAAI,WAAWF,MAAK,OAAO,KAAKA,OAAME,MAAK,GAAG,OAAO;AAAA,UAChF;AAGA,cAAIF,MAAK,aAAa,CAAC,MAAM;AAC3B,YAAAE,OAAM,UAAU;AAChB,YAAAA,OAAM,SAAS;AACf,YAAAA,OAAM,QAAQA,OAAM,UAAU;AAC9B,YAAAA,OAAM,YAAY;AAClB,YAAAF,MAAK,YAAYE,OAAM,GAAG;AAG1B,YAAAF,MAAK,aAAaE,OAAM,KAAK;AAG7B,YAAAD,QAAO,aAAa;AAAA,UACtB;AAGA,cAAI,CAACD,MAAK,aAAa,CAAC,MAAM;AAC5B,YAAAA,MAAK,KAAKE,OAAM,KAAK,IAAI;AAAA,UAC3B;AAEA,iBAAOF;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,aAAa,SAAS,IAAI;AACxB,cAAIA,QAAO;AAEX,cAAIA,MAAK,WAAW,EAAE,GAAG;AAEvB,gBAAI,OAAOA,MAAK,WAAW,EAAE,MAAM,YAAY;AAC7C,2BAAaA,MAAK,WAAW,EAAE,CAAC;AAAA,YAClC,OAAO;AACL,kBAAIE,SAAQF,MAAK,WAAW,EAAE;AAC9B,kBAAIE,UAASA,OAAM,OAAO;AACxB,gBAAAA,OAAM,MAAM,oBAAoB,SAASF,MAAK,WAAW,EAAE,GAAG,KAAK;AAAA,cACrE;AAAA,YACF;AAEA,mBAAOA,MAAK,WAAW,EAAE;AAAA,UAC3B;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,YAAY,SAAS,IAAI;AACvB,cAAIA,QAAO;AAGX,mBAAS,IAAE,GAAG,IAAEA,MAAK,QAAQ,QAAQ,KAAK;AACxC,gBAAI,OAAOA,MAAK,QAAQ,CAAC,EAAE,KAAK;AAC9B,qBAAOA,MAAK,QAAQ,CAAC;AAAA,YACvB;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,gBAAgB,WAAW;AACzB,cAAIA,QAAO;AAEX,UAAAA,MAAK,OAAO;AAGZ,mBAAS,IAAE,GAAG,IAAEA,MAAK,QAAQ,QAAQ,KAAK;AACxC,gBAAIA,MAAK,QAAQ,CAAC,EAAE,QAAQ;AAC1B,qBAAOA,MAAK,QAAQ,CAAC,EAAE,MAAM;AAAA,YAC/B;AAAA,UACF;AAGA,iBAAO,IAAIQ,OAAMR,KAAI;AAAA,QACvB;AAAA;AAAA;AAAA;AAAA,QAKA,QAAQ,WAAW;AACjB,cAAIA,QAAO;AACX,cAAI,QAAQA,MAAK;AACjB,cAAI,MAAM;AACV,cAAI,IAAI;AAGR,cAAIA,MAAK,QAAQ,SAAS,OAAO;AAC/B;AAAA,UACF;AAGA,eAAK,IAAE,GAAG,IAAEA,MAAK,QAAQ,QAAQ,KAAK;AACpC,gBAAIA,MAAK,QAAQ,CAAC,EAAE,QAAQ;AAC1B;AAAA,YACF;AAAA,UACF;AAGA,eAAK,IAAEA,MAAK,QAAQ,SAAS,GAAG,KAAG,GAAG,KAAK;AACzC,gBAAI,OAAO,OAAO;AAChB;AAAA,YACF;AAEA,gBAAIA,MAAK,QAAQ,CAAC,EAAE,QAAQ;AAE1B,kBAAIA,MAAK,aAAaA,MAAK,QAAQ,CAAC,EAAE,OAAO;AAC3C,gBAAAA,MAAK,QAAQ,CAAC,EAAE,MAAM,WAAW,CAAC;AAAA,cACpC;AAGA,cAAAA,MAAK,QAAQ,OAAO,GAAG,CAAC;AACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,cAAc,SAAS,IAAI;AACzB,cAAIA,QAAO;AAEX,cAAI,OAAO,OAAO,aAAa;AAC7B,gBAAI,MAAM,CAAC;AACX,qBAAS,IAAE,GAAG,IAAEA,MAAK,QAAQ,QAAQ,KAAK;AACxC,kBAAI,KAAKA,MAAK,QAAQ,CAAC,EAAE,GAAG;AAAA,YAC9B;AAEA,mBAAO;AAAA,UACT,OAAO;AACL,mBAAO,CAAC,EAAE;AAAA,UACZ;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,gBAAgB,SAASE,QAAO;AAC9B,cAAIF,QAAO;AAGX,UAAAE,OAAM,MAAM,eAAeD,QAAO,IAAI,mBAAmB;AACzD,UAAAC,OAAM,MAAM,aAAa,SAASW,OAAMb,MAAK,IAAI;AAGjD,cAAIE,OAAM,SAAS;AACjB,YAAAA,OAAM,MAAM,aAAa,QAAQA,OAAM,OAAO;AAAA,UAChD,OAAO;AACL,YAAAA,OAAM,MAAM,aAAa,QAAQA,OAAM,KAAK;AAAA,UAC9C;AAGA,UAAAA,OAAM,MAAM,aAAa,OAAOA,OAAM;AACtC,cAAIA,OAAM,OAAO;AACf,YAAAA,OAAM,MAAM,aAAa,YAAYA,OAAM,UAAU;AACrD,YAAAA,OAAM,MAAM,aAAa,UAAUA,OAAM,SAAS;AAAA,UACpD;AACA,UAAAA,OAAM,MAAM,aAAa,aAAa,eAAeA,OAAM,OAAOD,QAAO,IAAI,WAAW;AAExF,iBAAOD;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA,cAAc,SAAS,MAAM;AAC3B,cAAIA,QAAO;AACX,cAAI,QAAQC,QAAO,cAAcA,QAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;AAE9E,cAAI,CAAC,KAAK,cAAc;AACtB,mBAAOD;AAAA,UACT;AAEA,cAAIC,QAAO,kBAAkB,KAAK,cAAc;AAC9C,iBAAK,aAAa,UAAU;AAC5B,iBAAK,aAAa,WAAW,CAAC;AAC9B,gBAAI,OAAO;AACT,kBAAI;AAAE,qBAAK,aAAa,SAASA,QAAO;AAAA,cAAgB,SAAQ,GAAG;AAAA,cAAC;AAAA,YACtE;AAAA,UACF;AACA,eAAK,eAAe;AAEpB,iBAAOD;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,aAAa,SAAS,MAAM;AAC1B,cAAI,UAAU,kBAAkB,KAAKC,QAAO,cAAcA,QAAO,WAAW,SAAS;AACrF,cAAI,CAAC,SAAS;AACZ,iBAAK,MAAM;AAAA,UACb;AAAA,QACF;AAAA,MACF;AASA,UAAIO,SAAQ,SAAS,MAAM;AACzB,aAAK,UAAU;AACf,aAAK,KAAK;AAAA,MACZ;AACA,MAAAA,OAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QAKhB,MAAM,WAAW;AACf,cAAIR,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,UAAAA,MAAK,SAAS,OAAO;AACrB,UAAAA,MAAK,QAAQ,OAAO;AACpB,UAAAA,MAAK,UAAU,OAAO;AACtB,UAAAA,MAAK,QAAQ,OAAO;AACpB,UAAAA,MAAK,QAAQ;AACb,UAAAA,MAAK,UAAU;AACf,UAAAA,MAAK,SAAS;AACd,UAAAA,MAAK,UAAU;AAGf,UAAAA,MAAK,MAAM,EAAEC,QAAO;AAGpB,iBAAO,QAAQ,KAAKD,KAAI;AAGxB,UAAAA,MAAK,OAAO;AAEZ,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,QAAQ,WAAW;AACjB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAClB,cAAI,SAAUC,QAAO,UAAUD,MAAK,UAAUA,MAAK,QAAQ,SAAU,IAAIA,MAAK;AAE9E,cAAI,OAAO,WAAW;AAEpB,YAAAA,MAAK,QAAS,OAAOC,QAAO,IAAI,eAAe,cAAeA,QAAO,IAAI,eAAe,IAAIA,QAAO,IAAI,WAAW;AAClH,YAAAD,MAAK,MAAM,KAAK,eAAe,QAAQC,QAAO,IAAI,WAAW;AAC7D,YAAAD,MAAK,MAAM,SAAS;AACpB,YAAAA,MAAK,MAAM,QAAQC,QAAO,UAAU;AAAA,UACtC,WAAW,CAACA,QAAO,SAAS;AAE1B,YAAAD,MAAK,QAAQC,QAAO,kBAAkB;AAGtC,YAAAD,MAAK,WAAWA,MAAK,eAAe,KAAKA,KAAI;AAC7C,YAAAA,MAAK,MAAM,iBAAiB,SAASA,MAAK,UAAU,KAAK;AAGzD,YAAAA,MAAK,UAAUA,MAAK,cAAc,KAAKA,KAAI;AAC3C,YAAAA,MAAK,MAAM,iBAAiBC,QAAO,eAAeD,MAAK,SAAS,KAAK;AAIrE,YAAAA,MAAK,SAASA,MAAK,aAAa,KAAKA,KAAI;AACzC,YAAAA,MAAK,MAAM,iBAAiB,SAASA,MAAK,QAAQ,KAAK;AAGvD,YAAAA,MAAK,MAAM,MAAM,OAAO;AACxB,YAAAA,MAAK,MAAM,UAAU,OAAO,aAAa,OAAO,SAAS,OAAO;AAChE,YAAAA,MAAK,MAAM,SAAS,SAASC,QAAO,OAAO;AAG3C,YAAAD,MAAK,MAAM,KAAK;AAAA,UAClB;AAEA,iBAAOA;AAAA,QACT;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,OAAO,WAAW;AAChB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,UAAAA,MAAK,SAAS,OAAO;AACrB,UAAAA,MAAK,QAAQ,OAAO;AACpB,UAAAA,MAAK,UAAU,OAAO;AACtB,UAAAA,MAAK,QAAQ,OAAO;AACpB,UAAAA,MAAK,QAAQ;AACb,UAAAA,MAAK,YAAY;AACjB,UAAAA,MAAK,UAAU;AACf,UAAAA,MAAK,SAAS;AACd,UAAAA,MAAK,UAAU;AAGf,UAAAA,MAAK,MAAM,EAAEC,QAAO;AAEpB,iBAAOD;AAAA,QACT;AAAA;AAAA;AAAA;AAAA,QAKA,gBAAgB,WAAW;AACzB,cAAIA,QAAO;AAGX,UAAAA,MAAK,QAAQ,MAAM,aAAaA,MAAK,KAAKA,MAAK,MAAM,QAAQA,MAAK,MAAM,MAAM,OAAO,CAAC;AAGtF,UAAAA,MAAK,MAAM,oBAAoB,SAASA,MAAK,UAAU,KAAK;AAAA,QAC9D;AAAA;AAAA;AAAA;AAAA,QAKA,eAAe,WAAW;AACxB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,iBAAO,YAAY,KAAK,KAAKA,MAAK,MAAM,WAAW,EAAE,IAAI;AAGzD,cAAI,OAAO,KAAK,OAAO,OAAO,EAAE,WAAW,GAAG;AAC5C,mBAAO,UAAU,EAAC,WAAW,CAAC,GAAG,OAAO,YAAY,GAAI,EAAC;AAAA,UAC3D;AAEA,cAAI,OAAO,WAAW,UAAU;AAC9B,mBAAO,SAAS;AAChB,mBAAO,MAAM,MAAM;AACnB,mBAAO,WAAW;AAAA,UACpB;AAGA,UAAAA,MAAK,MAAM,oBAAoBC,QAAO,eAAeD,MAAK,SAAS,KAAK;AAAA,QAC1E;AAAA;AAAA;AAAA;AAAA,QAKA,cAAc,WAAW;AACvB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,cAAI,OAAO,cAAc,UAAU;AAGjC,mBAAO,YAAY,KAAK,KAAKA,MAAK,MAAM,WAAW,EAAE,IAAI;AAGzD,gBAAI,OAAO,QAAQ,UAAU,CAAC,MAAM,UAAU;AAC5C,qBAAO,QAAQ,UAAU,CAAC,IAAI,OAAO,YAAY;AAAA,YACnD;AAGA,mBAAO,OAAOA,KAAI;AAAA,UACpB;AAGA,UAAAA,MAAK,MAAM,oBAAoB,SAASA,MAAK,QAAQ,KAAK;AAAA,QAC5D;AAAA,MACF;AAKA,UAAIa,SAAQ,CAAC;AAMb,UAAI,aAAa,SAASb,OAAM;AAC9B,YAAI,MAAMA,MAAK;AAGf,YAAIa,OAAM,GAAG,GAAG;AAEd,UAAAb,MAAK,YAAYa,OAAM,GAAG,EAAE;AAG5B,oBAAUb,KAAI;AAEd;AAAA,QACF;AAEA,YAAI,sBAAsB,KAAK,GAAG,GAAG;AAEnC,cAAIe,QAAO,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AACjC,cAAI,WAAW,IAAI,WAAWA,MAAK,MAAM;AACzC,mBAAS,IAAE,GAAG,IAAEA,MAAK,QAAQ,EAAE,GAAG;AAChC,qBAAS,CAAC,IAAIA,MAAK,WAAW,CAAC;AAAA,UACjC;AAEA,0BAAgB,SAAS,QAAQf,KAAI;AAAA,QACvC,OAAO;AAEL,cAAI,MAAM,IAAI,eAAe;AAC7B,cAAI,KAAKA,MAAK,KAAK,QAAQ,KAAK,IAAI;AACpC,cAAI,kBAAkBA,MAAK,KAAK;AAChC,cAAI,eAAe;AAGnB,cAAIA,MAAK,KAAK,SAAS;AACrB,mBAAO,KAAKA,MAAK,KAAK,OAAO,EAAE,QAAQ,SAAS,KAAK;AACnD,kBAAI,iBAAiB,KAAKA,MAAK,KAAK,QAAQ,GAAG,CAAC;AAAA,YAClD,CAAC;AAAA,UACH;AAEA,cAAI,SAAS,WAAW;AAEtB,gBAAI,QAAQ,IAAI,SAAS,IAAI,CAAC;AAC9B,gBAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,cAAAA,MAAK,MAAM,aAAa,MAAM,4CAA4C,IAAI,SAAS,GAAG;AAC1F;AAAA,YACF;AAEA,4BAAgB,IAAI,UAAUA,KAAI;AAAA,UACpC;AACA,cAAI,UAAU,WAAW;AAEvB,gBAAIA,MAAK,WAAW;AAClB,cAAAA,MAAK,SAAS;AACd,cAAAA,MAAK,YAAY;AACjB,cAAAA,MAAK,UAAU,CAAC;AAChB,qBAAOa,OAAM,GAAG;AAChB,cAAAb,MAAK,KAAK;AAAA,YACZ;AAAA,UACF;AACA,sBAAY,GAAG;AAAA,QACjB;AAAA,MACF;AAMA,UAAI,cAAc,SAAS,KAAK;AAC9B,YAAI;AACF,cAAI,KAAK;AAAA,QACX,SAAS,GAAG;AACV,cAAI,QAAQ;AAAA,QACd;AAAA,MACF;AAOA,UAAI,kBAAkB,SAAS,aAAaA,OAAM;AAEhD,YAAI,QAAQ,WAAW;AACrB,UAAAA,MAAK,MAAM,aAAa,MAAM,6BAA6B;AAAA,QAC7D;AAGA,YAAI,UAAU,SAAS,QAAQ;AAC7B,cAAI,UAAUA,MAAK,QAAQ,SAAS,GAAG;AACrC,YAAAa,OAAMb,MAAK,IAAI,IAAI;AACnB,sBAAUA,OAAM,MAAM;AAAA,UACxB,OAAO;AACL,kBAAM;AAAA,UACR;AAAA,QACF;AAGA,YAAI,OAAO,YAAY,eAAeC,QAAO,IAAI,gBAAgB,WAAW,GAAG;AAC7E,UAAAA,QAAO,IAAI,gBAAgB,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK;AAAA,QACnE,OAAO;AACL,UAAAA,QAAO,IAAI,gBAAgB,aAAa,SAAS,KAAK;AAAA,QACxD;AAAA,MACF;AAOA,UAAI,YAAY,SAASD,OAAM,QAAQ;AAErC,YAAI,UAAU,CAACA,MAAK,WAAW;AAC7B,UAAAA,MAAK,YAAY,OAAO;AAAA,QAC1B;AAGA,YAAI,OAAO,KAAKA,MAAK,OAAO,EAAE,WAAW,GAAG;AAC1C,UAAAA,MAAK,UAAU,EAAC,WAAW,CAAC,GAAGA,MAAK,YAAY,GAAI,EAAC;AAAA,QACvD;AAGA,YAAIA,MAAK,WAAW,UAAU;AAC5B,UAAAA,MAAK,SAAS;AACd,UAAAA,MAAK,MAAM,MAAM;AACjB,UAAAA,MAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAKA,UAAI,oBAAoB,WAAW;AAEjC,YAAI,CAACC,QAAO,eAAe;AACzB;AAAA,QACF;AAGA,YAAI;AACF,cAAI,OAAO,iBAAiB,aAAa;AACvC,YAAAA,QAAO,MAAM,IAAI,aAAa;AAAA,UAChC,WAAW,OAAO,uBAAuB,aAAa;AACpD,YAAAA,QAAO,MAAM,IAAI,mBAAmB;AAAA,UACtC,OAAO;AACL,YAAAA,QAAO,gBAAgB;AAAA,UACzB;AAAA,QACF,SAAQ,GAAG;AACT,UAAAA,QAAO,gBAAgB;AAAA,QACzB;AAGA,YAAI,CAACA,QAAO,KAAK;AACf,UAAAA,QAAO,gBAAgB;AAAA,QACzB;AAIA,YAAIe,OAAO,iBAAiB,KAAKf,QAAO,cAAcA,QAAO,WAAW,QAAQ;AAChF,YAAI,aAAaA,QAAO,cAAcA,QAAO,WAAW,WAAW,MAAM,wBAAwB;AACjG,YAAIgB,WAAU,aAAa,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI;AACzD,YAAID,QAAOC,YAAWA,WAAU,GAAG;AACjC,cAAI,SAAS,SAAS,KAAKhB,QAAO,cAAcA,QAAO,WAAW,UAAU,YAAY,CAAC;AACzF,cAAIA,QAAO,cAAc,CAAC,QAAQ;AAChC,YAAAA,QAAO,gBAAgB;AAAA,UACzB;AAAA,QACF;AAGA,YAAIA,QAAO,eAAe;AACxB,UAAAA,QAAO,aAAc,OAAOA,QAAO,IAAI,eAAe,cAAeA,QAAO,IAAI,eAAe,IAAIA,QAAO,IAAI,WAAW;AACzH,UAAAA,QAAO,WAAW,KAAK,eAAeA,QAAO,SAAS,IAAIA,QAAO,SAASA,QAAO,IAAI,WAAW;AAChG,UAAAA,QAAO,WAAW,QAAQA,QAAO,IAAI,WAAW;AAAA,QAClD;AAGA,QAAAA,QAAO,OAAO;AAAA,MAChB;AAGA,UAAI,OAAO,WAAW,cAAc,OAAO,KAAK;AAC9C,eAAO,CAAC,GAAG,WAAW;AACpB,iBAAO;AAAA,YACL,QAAQA;AAAA,YACR,MAAMM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,OAAO,YAAY,aAAa;AAClC,gBAAQ,SAASN;AACjB,gBAAQ,OAAOM;AAAA,MACjB;AAGA,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO,eAAeR;AACtB,eAAO,SAASE;AAChB,eAAO,OAAOM;AACd,eAAO,QAAQC;AAAA,MACjB,WAAW,OAAO,WAAW,aAAa;AACxC,eAAO,eAAeT;AACtB,eAAO,SAASE;AAChB,eAAO,OAAOM;AACd,eAAO,QAAQC;AAAA,MACjB;AAAA,IACF,GAAG;AAeH,KAAC,WAAW;AAEV;AAGA,mBAAa,UAAU,OAAO,CAAC,GAAG,GAAG,CAAC;AACtC,mBAAa,UAAU,eAAe,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAWxD,mBAAa,UAAU,SAAS,SAAS,KAAK;AAC5C,YAAIR,QAAO;AAGX,YAAI,CAACA,MAAK,OAAO,CAACA,MAAK,IAAI,UAAU;AACnC,iBAAOA;AAAA,QACT;AAGA,iBAAS,IAAEA,MAAK,OAAO,SAAO,GAAG,KAAG,GAAG,KAAK;AAC1C,UAAAA,MAAK,OAAO,CAAC,EAAE,OAAO,GAAG;AAAA,QAC3B;AAEA,eAAOA;AAAA,MACT;AAUA,mBAAa,UAAU,MAAM,SAAS,GAAG,GAAG,GAAG;AAC7C,YAAIA,QAAO;AAGX,YAAI,CAACA,MAAK,OAAO,CAACA,MAAK,IAAI,UAAU;AACnC,iBAAOA;AAAA,QACT;AAGA,YAAK,OAAO,MAAM,WAAYA,MAAK,KAAK,CAAC,IAAI;AAC7C,YAAK,OAAO,MAAM,WAAYA,MAAK,KAAK,CAAC,IAAI;AAE7C,YAAI,OAAO,MAAM,UAAU;AACzB,UAAAA,MAAK,OAAO,CAAC,GAAG,GAAG,CAAC;AAEpB,cAAI,OAAOA,MAAK,IAAI,SAAS,cAAc,aAAa;AACtD,YAAAA,MAAK,IAAI,SAAS,UAAU,gBAAgBA,MAAK,KAAK,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG;AACrF,YAAAA,MAAK,IAAI,SAAS,UAAU,gBAAgBA,MAAK,KAAK,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG;AACrF,YAAAA,MAAK,IAAI,SAAS,UAAU,gBAAgBA,MAAK,KAAK,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG;AAAA,UACvF,OAAO;AACL,YAAAA,MAAK,IAAI,SAAS,YAAYA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,CAAC;AAAA,UACxE;AAAA,QACF,OAAO;AACL,iBAAOA,MAAK;AAAA,QACd;AAEA,eAAOA;AAAA,MACT;AAgBA,mBAAa,UAAU,cAAc,SAAS,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK;AACpE,YAAIA,QAAO;AAGX,YAAI,CAACA,MAAK,OAAO,CAACA,MAAK,IAAI,UAAU;AACnC,iBAAOA;AAAA,QACT;AAGA,YAAI,KAAKA,MAAK;AACd,YAAK,OAAO,MAAM,WAAY,GAAG,CAAC,IAAI;AACtC,YAAK,OAAO,MAAM,WAAY,GAAG,CAAC,IAAI;AACtC,cAAO,OAAO,QAAQ,WAAY,GAAG,CAAC,IAAI;AAC1C,cAAO,OAAO,QAAQ,WAAY,GAAG,CAAC,IAAI;AAC1C,cAAO,OAAO,QAAQ,WAAY,GAAG,CAAC,IAAI;AAE1C,YAAI,OAAO,MAAM,UAAU;AACzB,UAAAA,MAAK,eAAe,CAAC,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG;AAE3C,cAAI,OAAOA,MAAK,IAAI,SAAS,aAAa,aAAa;AACrD,YAAAA,MAAK,IAAI,SAAS,SAAS,gBAAgB,GAAG,OAAO,IAAI,aAAa,GAAG;AACzE,YAAAA,MAAK,IAAI,SAAS,SAAS,gBAAgB,GAAG,OAAO,IAAI,aAAa,GAAG;AACzE,YAAAA,MAAK,IAAI,SAAS,SAAS,gBAAgB,GAAG,OAAO,IAAI,aAAa,GAAG;AACzE,YAAAA,MAAK,IAAI,SAAS,IAAI,gBAAgB,KAAK,OAAO,IAAI,aAAa,GAAG;AACtE,YAAAA,MAAK,IAAI,SAAS,IAAI,gBAAgB,KAAK,OAAO,IAAI,aAAa,GAAG;AACtE,YAAAA,MAAK,IAAI,SAAS,IAAI,gBAAgB,KAAK,OAAO,IAAI,aAAa,GAAG;AAAA,UACxE,OAAO;AACL,YAAAA,MAAK,IAAI,SAAS,eAAe,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG;AAAA,UACzD;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,QACT;AAEA,eAAOA;AAAA,MACT;AAUA,WAAK,UAAU,OAAQ,0BAAS,QAAQ;AACtC,eAAO,SAAS,GAAG;AACjB,cAAIA,QAAO;AAGX,UAAAA,MAAK,eAAe,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC;AAC7C,UAAAA,MAAK,UAAU,EAAE,UAAU;AAC3B,UAAAA,MAAK,OAAO,EAAE,OAAO;AACrB,UAAAA,MAAK,cAAc;AAAA,YACjB,gBAAgB,OAAO,EAAE,mBAAmB,cAAc,EAAE,iBAAiB;AAAA,YAC7E,gBAAgB,OAAO,EAAE,mBAAmB,cAAc,EAAE,iBAAiB;AAAA,YAC7E,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB;AAAA,YAC1E,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB;AAAA,YAC1E,aAAa,OAAO,EAAE,gBAAgB,cAAc,EAAE,cAAc;AAAA,YACpE,cAAc,OAAO,EAAE,iBAAiB,cAAc,EAAE,eAAe;AAAA,YACvE,aAAa,OAAO,EAAE,gBAAgB,cAAc,EAAE,cAAc;AAAA,YACpE,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB;AAAA,UAC5E;AAGA,UAAAA,MAAK,YAAY,EAAE,WAAW,CAAC,EAAC,IAAI,EAAE,SAAQ,CAAC,IAAI,CAAC;AACpD,UAAAA,MAAK,SAAS,EAAE,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAK,CAAC,IAAI,CAAC;AAC3C,UAAAA,MAAK,iBAAiB,EAAE,gBAAgB,CAAC,EAAC,IAAI,EAAE,cAAa,CAAC,IAAI,CAAC;AAGnE,iBAAO,OAAO,KAAK,MAAM,CAAC;AAAA,QAC5B;AAAA,MACF,GAAG,KAAK,UAAU,IAAI;AAQtB,WAAK,UAAU,SAAS,SAAS,KAAK,IAAI;AACxC,YAAIA,QAAO;AAGX,YAAI,CAACA,MAAK,WAAW;AACnB,iBAAOA;AAAA,QACT;AAGA,YAAIA,MAAK,WAAW,UAAU;AAC5B,UAAAA,MAAK,OAAO,KAAK;AAAA,YACf,OAAO;AAAA,YACP,QAAQ,WAAW;AACjB,cAAAA,MAAK,OAAO,KAAK,EAAE;AAAA,YACrB;AAAA,UACF,CAAC;AAED,iBAAOA;AAAA,QACT;AAGA,YAAI,aAAc,OAAO,OAAO,IAAI,uBAAuB,cAAe,YAAY;AAGtF,YAAI,OAAO,OAAO,aAAa;AAE7B,cAAI,OAAO,QAAQ,UAAU;AAC3B,YAAAA,MAAK,UAAU;AACf,YAAAA,MAAK,OAAO,CAAC,KAAK,GAAG,CAAC;AAAA,UACxB,OAAO;AACL,mBAAOA,MAAK;AAAA,UACd;AAAA,QACF;AAGA,YAAI,MAAMA,MAAK,aAAa,EAAE;AAC9B,iBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,cAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,cAAIE,QAAO;AACT,gBAAI,OAAO,QAAQ,UAAU;AAC3B,cAAAA,OAAM,UAAU;AAChB,cAAAA,OAAM,OAAO,CAAC,KAAK,GAAG,CAAC;AAEvB,kBAAIA,OAAM,OAAO;AAEf,gBAAAA,OAAM,YAAY,eAAe;AAGjC,oBAAI,CAACA,OAAM,WAAW,CAACA,OAAM,QAAQ,KAAK;AACxC,8BAAYA,QAAO,UAAU;AAAA,gBAC/B;AAEA,oBAAI,eAAe,WAAW;AAC5B,sBAAI,OAAOA,OAAM,QAAQ,cAAc,aAAa;AAClD,oBAAAA,OAAM,QAAQ,UAAU,eAAe,KAAK,OAAO,IAAI,WAAW;AAClE,oBAAAA,OAAM,QAAQ,UAAU,eAAe,GAAG,OAAO,IAAI,WAAW;AAChE,oBAAAA,OAAM,QAAQ,UAAU,eAAe,GAAG,OAAO,IAAI,WAAW;AAAA,kBAClE,OAAO;AACL,oBAAAA,OAAM,QAAQ,YAAY,KAAK,GAAG,CAAC;AAAA,kBACrC;AAAA,gBACF,OAAO;AACL,kBAAAA,OAAM,QAAQ,IAAI,eAAe,KAAK,OAAO,IAAI,WAAW;AAAA,gBAC9D;AAAA,cACF;AAEA,cAAAF,MAAK,MAAM,UAAUE,OAAM,GAAG;AAAA,YAChC,OAAO;AACL,qBAAOA,OAAM;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,eAAOF;AAAA,MACT;AAUA,WAAK,UAAU,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI;AACzC,YAAIA,QAAO;AAGX,YAAI,CAACA,MAAK,WAAW;AACnB,iBAAOA;AAAA,QACT;AAGA,YAAIA,MAAK,WAAW,UAAU;AAC5B,UAAAA,MAAK,OAAO,KAAK;AAAA,YACf,OAAO;AAAA,YACP,QAAQ,WAAW;AACjB,cAAAA,MAAK,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,YACtB;AAAA,UACF,CAAC;AAED,iBAAOA;AAAA,QACT;AAGA,YAAK,OAAO,MAAM,WAAY,IAAI;AAClC,YAAK,OAAO,MAAM,WAAY,OAAO;AAGrC,YAAI,OAAO,OAAO,aAAa;AAE7B,cAAI,OAAO,MAAM,UAAU;AACzB,YAAAA,MAAK,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA,UACtB,OAAO;AACL,mBAAOA,MAAK;AAAA,UACd;AAAA,QACF;AAGA,YAAI,MAAMA,MAAK,aAAa,EAAE;AAC9B,iBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,cAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,cAAIE,QAAO;AACT,gBAAI,OAAO,MAAM,UAAU;AACzB,cAAAA,OAAM,OAAO,CAAC,GAAG,GAAG,CAAC;AAErB,kBAAIA,OAAM,OAAO;AAEf,oBAAI,CAACA,OAAM,WAAWA,OAAM,QAAQ,KAAK;AACvC,8BAAYA,QAAO,SAAS;AAAA,gBAC9B;AAEA,oBAAI,OAAOA,OAAM,QAAQ,cAAc,aAAa;AAClD,kBAAAA,OAAM,QAAQ,UAAU,eAAe,GAAG,OAAO,IAAI,WAAW;AAChE,kBAAAA,OAAM,QAAQ,UAAU,eAAe,GAAG,OAAO,IAAI,WAAW;AAChE,kBAAAA,OAAM,QAAQ,UAAU,eAAe,GAAG,OAAO,IAAI,WAAW;AAAA,gBAClE,OAAO;AACL,kBAAAA,OAAM,QAAQ,YAAY,GAAG,GAAG,CAAC;AAAA,gBACnC;AAAA,cACF;AAEA,cAAAF,MAAK,MAAM,OAAOE,OAAM,GAAG;AAAA,YAC7B,OAAO;AACL,qBAAOA,OAAM;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,eAAOF;AAAA,MACT;AAYA,WAAK,UAAU,cAAc,SAAS,GAAG,GAAG,GAAG,IAAI;AACjD,YAAIA,QAAO;AAGX,YAAI,CAACA,MAAK,WAAW;AACnB,iBAAOA;AAAA,QACT;AAGA,YAAIA,MAAK,WAAW,UAAU;AAC5B,UAAAA,MAAK,OAAO,KAAK;AAAA,YACf,OAAO;AAAA,YACP,QAAQ,WAAW;AACjB,cAAAA,MAAK,YAAY,GAAG,GAAG,GAAG,EAAE;AAAA,YAC9B;AAAA,UACF,CAAC;AAED,iBAAOA;AAAA,QACT;AAGA,YAAK,OAAO,MAAM,WAAYA,MAAK,aAAa,CAAC,IAAI;AACrD,YAAK,OAAO,MAAM,WAAYA,MAAK,aAAa,CAAC,IAAI;AAGrD,YAAI,OAAO,OAAO,aAAa;AAE7B,cAAI,OAAO,MAAM,UAAU;AACzB,YAAAA,MAAK,eAAe,CAAC,GAAG,GAAG,CAAC;AAAA,UAC9B,OAAO;AACL,mBAAOA,MAAK;AAAA,UACd;AAAA,QACF;AAGA,YAAI,MAAMA,MAAK,aAAa,EAAE;AAC9B,iBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAE/B,cAAIE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAElC,cAAIE,QAAO;AACT,gBAAI,OAAO,MAAM,UAAU;AACzB,cAAAA,OAAM,eAAe,CAAC,GAAG,GAAG,CAAC;AAE7B,kBAAIA,OAAM,OAAO;AAEf,oBAAI,CAACA,OAAM,SAAS;AAElB,sBAAI,CAACA,OAAM,MAAM;AACf,oBAAAA,OAAM,OAAOF,MAAK,QAAQ,CAAC,GAAG,GAAG,IAAI;AAAA,kBACvC;AAEA,8BAAYE,QAAO,SAAS;AAAA,gBAC9B;AAEA,oBAAI,OAAOA,OAAM,QAAQ,iBAAiB,aAAa;AACrD,kBAAAA,OAAM,QAAQ,aAAa,eAAe,GAAG,OAAO,IAAI,WAAW;AACnE,kBAAAA,OAAM,QAAQ,aAAa,eAAe,GAAG,OAAO,IAAI,WAAW;AACnE,kBAAAA,OAAM,QAAQ,aAAa,eAAe,GAAG,OAAO,IAAI,WAAW;AAAA,gBACrE,OAAO;AACL,kBAAAA,OAAM,QAAQ,eAAe,GAAG,GAAG,CAAC;AAAA,gBACtC;AAAA,cACF;AAEA,cAAAF,MAAK,MAAM,eAAeE,OAAM,GAAG;AAAA,YACrC,OAAO;AACL,qBAAOA,OAAM;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,eAAOF;AAAA,MACT;AAgCA,WAAK,UAAU,aAAa,WAAW;AACrC,YAAIA,QAAO;AACX,YAAI,OAAO;AACX,YAAI,GAAG,IAAIE;AAGX,YAAI,CAACF,MAAK,WAAW;AACnB,iBAAOA;AAAA,QACT;AAGA,YAAI,KAAK,WAAW,GAAG;AAErB,iBAAOA,MAAK;AAAA,QACd,WAAW,KAAK,WAAW,GAAG;AAC5B,cAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,gBAAI,KAAK,CAAC;AAGV,gBAAI,OAAO,OAAO,aAAa;AAC7B,kBAAI,CAAC,EAAE,YAAY;AACjB,kBAAE,aAAa;AAAA,kBACb,gBAAgB,EAAE;AAAA,kBAClB,gBAAgB,EAAE;AAAA,kBAClB,eAAe,EAAE;AAAA,kBACjB,eAAe,EAAE;AAAA,kBACjB,aAAa,EAAE;AAAA,kBACf,aAAa,EAAE;AAAA,kBACf,eAAe,EAAE;AAAA,kBACjB,cAAc,EAAE;AAAA,gBAClB;AAAA,cACF;AAEA,cAAAA,MAAK,cAAc;AAAA,gBACjB,gBAAgB,OAAO,EAAE,WAAW,mBAAmB,cAAc,EAAE,WAAW,iBAAiBA,MAAK;AAAA,gBACxG,gBAAgB,OAAO,EAAE,WAAW,mBAAmB,cAAc,EAAE,WAAW,iBAAiBA,MAAK;AAAA,gBACxG,eAAe,OAAO,EAAE,WAAW,kBAAkB,cAAc,EAAE,WAAW,gBAAgBA,MAAK;AAAA,gBACrG,eAAe,OAAO,EAAE,WAAW,kBAAkB,cAAc,EAAE,WAAW,gBAAgBA,MAAK;AAAA,gBACrG,aAAa,OAAO,EAAE,WAAW,gBAAgB,cAAc,EAAE,WAAW,cAAcA,MAAK;AAAA,gBAC/F,aAAa,OAAO,EAAE,WAAW,gBAAgB,cAAc,EAAE,WAAW,cAAcA,MAAK;AAAA,gBAC/F,eAAe,OAAO,EAAE,WAAW,kBAAkB,cAAc,EAAE,WAAW,gBAAgBA,MAAK;AAAA,gBACrG,cAAc,OAAO,EAAE,WAAW,iBAAiB,cAAc,EAAE,WAAW,eAAeA,MAAK;AAAA,cACpG;AAAA,YACF;AAAA,UACF,OAAO;AAEL,YAAAE,SAAQF,MAAK,WAAW,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;AAC7C,mBAAOE,SAAQA,OAAM,cAAcF,MAAK;AAAA,UAC1C;AAAA,QACF,WAAW,KAAK,WAAW,GAAG;AAC5B,cAAI,KAAK,CAAC;AACV,eAAK,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA,QAC3B;AAGA,YAAI,MAAMA,MAAK,aAAa,EAAE;AAC9B,iBAAS,IAAE,GAAG,IAAE,IAAI,QAAQ,KAAK;AAC/B,UAAAE,SAAQF,MAAK,WAAW,IAAI,CAAC,CAAC;AAE9B,cAAIE,QAAO;AAET,gBAAI,KAAKA,OAAM;AACf,iBAAK;AAAA,cACH,gBAAgB,OAAO,EAAE,mBAAmB,cAAc,EAAE,iBAAiB,GAAG;AAAA,cAChF,gBAAgB,OAAO,EAAE,mBAAmB,cAAc,EAAE,iBAAiB,GAAG;AAAA,cAChF,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB,GAAG;AAAA,cAC7E,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB,GAAG;AAAA,cAC7E,aAAa,OAAO,EAAE,gBAAgB,cAAc,EAAE,cAAc,GAAG;AAAA,cACvE,aAAa,OAAO,EAAE,gBAAgB,cAAc,EAAE,cAAc,GAAG;AAAA,cACvE,eAAe,OAAO,EAAE,kBAAkB,cAAc,EAAE,gBAAgB,GAAG;AAAA,cAC7E,cAAc,OAAO,EAAE,iBAAiB,cAAc,EAAE,eAAe,GAAG;AAAA,YAC5E;AAGA,gBAAIgB,UAAShB,OAAM;AACnB,gBAAI,CAACgB,SAAQ;AAEX,kBAAI,CAAChB,OAAM,MAAM;AACf,gBAAAA,OAAM,OAAOF,MAAK,QAAQ,CAAC,GAAG,GAAG,IAAI;AAAA,cACvC;AAGA,0BAAYE,QAAO,SAAS;AAC5B,cAAAgB,UAAShB,OAAM;AAAA,YACjB;AAGA,YAAAgB,QAAO,iBAAiB,GAAG;AAC3B,YAAAA,QAAO,iBAAiB,GAAG;AAC3B,YAAAA,QAAO,gBAAgB,GAAG;AAC1B,YAAAA,QAAO,gBAAgB,GAAG;AAC1B,YAAAA,QAAO,cAAc,GAAG;AACxB,YAAAA,QAAO,cAAc,GAAG;AACxB,YAAAA,QAAO,gBAAgB,GAAG;AAC1B,YAAAA,QAAO,eAAe,GAAG;AAAA,UAC3B;AAAA,QACF;AAEA,eAAOlB;AAAA,MACT;AAUA,YAAM,UAAU,OAAQ,0BAAS,QAAQ;AACvC,eAAO,WAAW;AAChB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,UAAAA,MAAK,eAAe,OAAO;AAC3B,UAAAA,MAAK,UAAU,OAAO;AACtB,UAAAA,MAAK,OAAO,OAAO;AACnB,UAAAA,MAAK,cAAc,OAAO;AAG1B,iBAAO,KAAK,IAAI;AAGhB,cAAIA,MAAK,SAAS;AAChB,mBAAO,OAAOA,MAAK,OAAO;AAAA,UAC5B,WAAWA,MAAK,MAAM;AACpB,mBAAO,IAAIA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,GAAGA,MAAK,GAAG;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,GAAG,MAAM,UAAU,IAAI;AAOvB,YAAM,UAAU,QAAS,0BAAS,QAAQ;AACxC,eAAO,WAAW;AAChB,cAAIA,QAAO;AACX,cAAI,SAASA,MAAK;AAGlB,UAAAA,MAAK,eAAe,OAAO;AAC3B,UAAAA,MAAK,UAAU,OAAO;AACtB,UAAAA,MAAK,OAAO,OAAO;AACnB,UAAAA,MAAK,cAAc,OAAO;AAG1B,cAAIA,MAAK,SAAS;AAChB,mBAAO,OAAOA,MAAK,OAAO;AAAA,UAC5B,WAAWA,MAAK,MAAM;AACpB,mBAAO,IAAIA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,GAAGA,MAAK,KAAK,CAAC,GAAGA,MAAK,GAAG;AAAA,UAC/D,WAAWA,MAAK,SAAS;AAEvB,YAAAA,MAAK,QAAQ,WAAW,CAAC;AACzB,YAAAA,MAAK,UAAU;AACf,mBAAO,eAAeA,KAAI;AAAA,UAC5B;AAGA,iBAAO,OAAO,KAAK,IAAI;AAAA,QACzB;AAAA,MACF,GAAG,MAAM,UAAU,KAAK;AAUxB,UAAI,cAAc,SAASE,QAAO,MAAM;AACtC,eAAO,QAAQ;AAGf,YAAI,SAAS,WAAW;AACtB,UAAAA,OAAM,UAAU,OAAO,IAAI,aAAa;AACxC,UAAAA,OAAM,QAAQ,iBAAiBA,OAAM,YAAY;AACjD,UAAAA,OAAM,QAAQ,iBAAiBA,OAAM,YAAY;AACjD,UAAAA,OAAM,QAAQ,gBAAgBA,OAAM,YAAY;AAChD,UAAAA,OAAM,QAAQ,gBAAgBA,OAAM,YAAY;AAChD,UAAAA,OAAM,QAAQ,cAAcA,OAAM,YAAY;AAC9C,UAAAA,OAAM,QAAQ,cAAcA,OAAM,YAAY;AAC9C,UAAAA,OAAM,QAAQ,gBAAgBA,OAAM,YAAY;AAChD,UAAAA,OAAM,QAAQ,eAAeA,OAAM,YAAY;AAE/C,cAAI,OAAOA,OAAM,QAAQ,cAAc,aAAa;AAClD,YAAAA,OAAM,QAAQ,UAAU,eAAeA,OAAM,KAAK,CAAC,GAAG,OAAO,IAAI,WAAW;AAC5E,YAAAA,OAAM,QAAQ,UAAU,eAAeA,OAAM,KAAK,CAAC,GAAG,OAAO,IAAI,WAAW;AAC5E,YAAAA,OAAM,QAAQ,UAAU,eAAeA,OAAM,KAAK,CAAC,GAAG,OAAO,IAAI,WAAW;AAAA,UAC9E,OAAO;AACL,YAAAA,OAAM,QAAQ,YAAYA,OAAM,KAAK,CAAC,GAAGA,OAAM,KAAK,CAAC,GAAGA,OAAM,KAAK,CAAC,CAAC;AAAA,UACvE;AAEA,cAAI,OAAOA,OAAM,QAAQ,iBAAiB,aAAa;AACrD,YAAAA,OAAM,QAAQ,aAAa,eAAeA,OAAM,aAAa,CAAC,GAAG,OAAO,IAAI,WAAW;AACvF,YAAAA,OAAM,QAAQ,aAAa,eAAeA,OAAM,aAAa,CAAC,GAAG,OAAO,IAAI,WAAW;AACvF,YAAAA,OAAM,QAAQ,aAAa,eAAeA,OAAM,aAAa,CAAC,GAAG,OAAO,IAAI,WAAW;AAAA,UACzF,OAAO;AACL,YAAAA,OAAM,QAAQ,eAAeA,OAAM,aAAa,CAAC,GAAGA,OAAM,aAAa,CAAC,GAAGA,OAAM,aAAa,CAAC,CAAC;AAAA,UAClG;AAAA,QACF,OAAO;AACL,UAAAA,OAAM,UAAU,OAAO,IAAI,mBAAmB;AAC9C,UAAAA,OAAM,QAAQ,IAAI,eAAeA,OAAM,SAAS,OAAO,IAAI,WAAW;AAAA,QACxE;AAEA,QAAAA,OAAM,QAAQ,QAAQA,OAAM,KAAK;AAGjC,YAAI,CAACA,OAAM,SAAS;AAClB,UAAAA,OAAM,QAAQ,MAAMA,OAAM,KAAK,IAAI,EAAE,KAAKA,OAAM,KAAK,IAAI;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,GAAG;AAAA;AAAA;;;AC9qGH,yBAAO;AAGP,wBAAO;AACP,sBAAO;;;ACLP,IAAI,OAAO,eAAe,aAAa;AACtC,MAAI,OAAO,WAAW,YAAY,aAAa;AAC9C,eAAW,UAAU,CAAC;AACtB,eAAW,QAAQ,MAAM,WAAY;AAAA,IAAC;AACtC,eAAW,QAAQ,SAAS,WAAY;AAAA,IAAC;AACzC,eAAW,QAAQ,OAAO,WAAY;AAAA,IAAC;AACvC,eAAW,QAAQ,QAAQ,YAAa,MAAa;AACpD,YAAM,MAAM,UAAU,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACD;AACD;;;ACJA,SAAS,UAER,GACA,GACA,GACA,GACA,OACC;AACD,MACC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU;AAC9B,WAAO,OAAO,SAAS,KAAK;AAAA,EAC7B,CAAC,GACA;AACD;AAAA,EACD;AAEA,QAAM,cAAc,mBAAmB,KAAK;AAE5C,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,YAAY,WAAW,GAAG;AAC7B,gBAAY,cAAc,YAAY,CAAC,CAAC;AACxC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,gBAAY,cAAc,YAAY,CAAC,CAAC;AAAA,EACzC,WAAW,YAAY,WAAW,GAAG;AACpC,gBAAY,cAAc,YAAY,CAAC,CAAC;AACxC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,gBAAY,cAAc,YAAY,CAAC,CAAC;AACxC,iBAAa,cAAc,YAAY,CAAC,CAAC;AAAA,EAC1C,WAAW,YAAY,WAAW,GAAG;AACpC,gBAAY,cAAc,YAAY,CAAC,CAAC;AACxC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,gBAAY,cAAc,YAAY,CAAC,CAAC;AAAA,EACzC,WAAW,YAAY,WAAW,GAAG;AACpC,gBAAY,cAAc,YAAY,CAAC,CAAC;AACxC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,iBAAa,cAAc,YAAY,CAAC,CAAC;AACzC,gBAAY,cAAc,YAAY,CAAC,CAAC;AAAA,EACzC,OAAO;AACN,UAAM,IAAI;AAAA,MACT,GAAG,YAAY,MAAM;AAAA,IACtB;AAAA,EACD;AAEA,QAAM,UAAU,CAAC,WAAW,YAAY,YAAY,SAAS;AAC7D,QAAM,iBAAiB,QAAQ,KAAK,CAAC,EAAE,GAAAiB,IAAG,GAAAC,GAAE,MAAM;AACjD,WAAOD,KAAI,KAAKC,KAAI;AAAA,EACrB,CAAC;AAGD,MACC,QAAQ,KAAK,CAAC,EAAE,GAAAD,IAAG,GAAAC,GAAE,MAAM;AAC1B,WAAO,CAAC,OAAO,SAASD,EAAC,KAAK,CAAC,OAAO,SAASC,EAAC;AAAA,EACjD,CAAC,GACA;AACD;AAAA,EACD;AAEA,MAAI,gBAAgB;AAEnB,UAAM,IAAI,MAAM,gBAAgB,cAAc,eAAe;AAAA,EAC9D;AAEA,wBAAsB,OAAO;AAE7B,MAAI,IAAI,KAAK,IAAI,GAAG;AACnB,SAAK,OAAO,IAAI,UAAU,GAAG,CAAC;AAC9B,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX,CAAC,KAAK;AAAA,IACP;AACA,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,IAAI,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,CAAC,KAAK;AAAA,MACN,CAAC,KAAK,KAAK;AAAA,IACZ;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,IAAI,UAAU;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,UAAU;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,IACZ;AAAA,EACD,WAAW,IAAI,GAAG;AACjB,SAAK,OAAO,IAAI,UAAU,GAAG,CAAC;AAC9B,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX,CAAC,KAAK;AAAA,MACN;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,IAAI,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,CAAC,KAAK;AAAA,MACN,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,IAAI,UAAU;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,UAAU;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AAAA,EACD,WAAW,IAAI,GAAG;AACjB,SAAK,OAAO,IAAI,UAAU,GAAG,CAAC;AAC9B,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,IAAI,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,IAAI,UAAU;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX,CAAC,KAAK;AAAA,MACN;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,UAAU;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,CAAC,KAAK;AAAA,MACN,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AAAA,EACD,OAAO;AACN,SAAK,OAAO,IAAI,UAAU,GAAG,CAAC;AAC9B,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,CAAC,KAAK,KAAK;AAAA,MACX;AAAA,IACD;AACA,SAAK;AAAA,MACJ,IAAI,IAAI,WAAW;AAAA,MACnB,IAAI,IAAI,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,KAAK,KAAK;AAAA,IACX;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,IAAI,UAAU;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,KAAK,KAAK;AAAA,MACV,KAAK;AAAA,IACN;AACA,SAAK;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,UAAU;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AAAA,IACX;AAAA,EACD;AAEA,OAAK,UAAU;AACf,OAAK,OAAO,GAAG,CAAC;AAGhB,WAAS,eAAe,OAKrB;AACF,UAAM,EAAE,GAAAD,IAAG,GAAAC,IAAG,GAAG,GAAAC,GAAE,IAAI;AACvB,WAAO,EAAE,GAAAF,IAAG,GAAAC,IAAG,GAAG,GAAAC,GAAE;AAAA,EACrB;AAGA,WAAS,mBACR,OAMY;AAIZ,UAAM,OAAO,OAAO;AAEpB,QAAI,SAAS,eAAe,UAAU,MAAM;AAC3C,aAAO,CAAC,CAAC;AAAA,IACV;AACA,QAAI,SAAS,YAAY;AACxB,aAAO,CAAC,GAAG;AAAA,IACZ;AACA,QAAI,SAAS,UAAU;AACtB,UAAI,OAAO,MAAM,OAAO,QAAQ,MAAM,YAAY;AACjD,eAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS;AAG/B,gBAAM,WAAW,OAAO;AACxB,cAAI,aAAa,eAAe,SAAS,MAAM;AAC9C,mBAAO;AAAA,UACR;AACA,cAAI,aAAa,YAAY;AAC5B,mBAAO;AAAA,UACR;AACA,cAAI,aAAa,UAAU;AAC1B,mBAAO,eAAe,IAAI;AAAA,UAC3B;AACA,iBAAO,qBAAqB,IAAI;AAAA,QACjC,CAAC;AAAA,MACF;AAEA,aAAO,CAAC,eAAe,KAAK,CAAC;AAAA,IAC9B;AAEA,WAAO,CAAC,qBAAqB,KAAK,CAAC;AAAA,EACpC;AAGA,WAAS,qBAAqB,OAAY;AACzC,WAAO,CAAC;AAAA,EACT;AAGA,WAAS,cAAc,OAAY;AAClC,UAAM,WAAW,qBAAqB,KAAK;AAC3C,QAAI,OAAO,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,MACJ;AAAA,IACD;AACA,QAAI,OAAO,KAAK,MAAM,OAAO;AAC5B,aAAO;AAAA,QACN,GAAG,qBAAqB,MAAM,KAAK,CAAC;AAAA,QACpC,GAAG,qBAAqB,MAAM,KAAK,CAAC;AAAA,MACrC;AAAA,IACD;AAEA,WAAO;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,IACJ;AAAA,EACD;AAGA,WAAS,sBAAsBC,UAAc;AAC5C,UAAM,CAACC,YAAWC,aAAYC,aAAYC,UAAS,IAAIJ;AACvD,UAAM,UAAU;AAAA;AAAA,MAEf,KAAK,IAAI,CAAC,KAAKC,WAAU,IAAIC,YAAW;AAAA;AAAA,MAExC,KAAK,IAAI,CAAC,KAAKA,YAAW,IAAIC,YAAW;AAAA;AAAA,MAEzC,KAAK,IAAI,CAAC,KAAKA,YAAW,IAAIC,WAAU;AAAA;AAAA,MAExC,KAAK,IAAI,CAAC,KAAKH,WAAU,IAAIG,WAAU;AAAA,IACxC;AACA,UAAM,YAAY,KAAK,IAAI,GAAG,OAAO;AACrC,QAAI,aAAa,GAAG;AACnB,MAAAJ,SAAQ,QAAQ,CAACK,WAAe;AAC/B,QAAAA,OAAM,KAAK;AACX,QAAAA,OAAM,KAAK;AAAA,MACZ,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,IAAI,WAAW,0BAA0B;AACxC,MAAI,OAAO,WAAW,OAAO,UAAU,cAAc,aAAa;AACjE,eAAW,OAAO,UAAU,YAAY;AAAA,EACzC;AACD;AACA,IAAI,WAAW,0BAA0B;AACxC,MACC,OAAO,WAAW,yBAAyB,UAAU,cACrD,aACC;AACD,eAAW,yBAAyB,UAAU,YAAY;AAAA,EAC3D;AACD;AACA,IAAI,WAAW,mCAAmC;AACjD,MACC,OAAO,WAAW,kCAAkC,UAAU,cAC9D,aACC;AACD,eAAW,kCAAkC,UAAU,YACtD;AAAA,EACF;AACD;;;AC7WO,IAAM,SAAS;AAKf,IAAM,QAAQ;AAKd,IAAM,OAAO;;;ACbpB,IAAM,cAAc,CAAI,QAAgB;AACvC,aAAW,SAAS,KAAK;AACxB,QAAI,OAAO,KAAK;AAChB,WAAO;AAAA,EACR;AACD;AAoBA,IAAM,QAA0C,CAAC;AAM1C,IAAM,eAAe,CAAC,KAAaC,UAA2B;AACpE,QAAM,GAAG,IAAIA;AACd;AAKO,IAAM,qBAAqB,MAAM;AAEjC,IAAM,aAAa,CACzB,YACgB;AAChB,QAAM,YAAY,oBAAI,IAAO;AAC7B,QAAM,uBAAuB,oBAAI,IAAiB;AAClD,QAAM,yBAAyB,oBAAI,IAAgB;AACnD,MAAI,QAAgB;AAEpB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKN,SAAS,CAAC,aAAgB;AACzB,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC5B,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAC/C;AACA,YAAM,UAAU,uBAAuB,IAAI,QAAQ;AACnD,gBAAU;AACV,gBAAU,IAAI,QAAQ;AACtB;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,IAAI,SAAS;AACjB,YAAM,SAAS,YAAY,SAAS;AACpC,UAAI,QAAQ;AACX,cAAMC,SAAQ,qBAAqB,IAAI,MAAM;AAC7C,QAAAA,SAAQ,GAAG,IAAI;AACf;AACA,eAAO;AAAA,MACR,OAAO;AACN,cAAM,EAAE,UAAU,OAAAA,QAAO,QAAQ,IAAI,QAAQ,GAAG,IAAI;AACpD,6BAAqB,IAAI,UAAUA,MAAK;AACxC,+BAAuB,IAAI,UAAU,OAAO;AAC5C;AACA,eAAO;AAAA,MACR;AAAA,IACD;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,MAAM;AACZ,gBAAU,MAAM;AAChB,cAAQ;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAIA,MAAM,MAAM;AACX,aAAO,UAAU;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAIA,MAAM,MAAM;AACX,aAAO;AAAA,IACR;AAAA,EACD;AACD;;;ACrGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,IAAM,aAAa,KAAK,KAAK;AAK7B,IAAM,aAAa,MAAQ,KAAK;AAKhC,IAAM,MAAM,KAAK,KAAK;AAKtB,IAAM,MAAM,KAAK,KAAK;AAKtB,IAAM,UAAU;AAOhB,SAAS,aAAa,KAAa;AACzC,UAAQ,MAAO,MAAM,OAAQ;AAC9B;AAOO,SAAS,cAAc,KAAa;AAC1C,MAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,GAAG;AACxC,WAAO;AAAA,EACR;AACA,MAAI,QAAQ,GAAG;AACd,WAAO;AAAA,EACR;AAEA,OAAK,MAAO,MAAM,OAAQ,GAAG;AAC5B,SAAK,MAAM,gBAAgB,GAAG;AAC7B,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAOO,SAAS,eAAe,KAAa;AAC3C;AACA,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,OAAO;AACd;AACA,SAAO;AACR;AAUO,SAAS,SAAS,OAAe;AACvC,SAAO,QAAQ;AAChB;AAUO,SAAS,SAAS,SAAiB;AACzC,SAAO,UAAU;AAClB;AASO,SAAS,MAAM,KAAa,KAAa,MAAc;AAC7D,SAAO,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO;AAC9C;AAWO,SAAS,OAAO,KAAa,KAAa;AAChD,SAAO,CAAC,EAAE,KAAK,OAAO,KAAK,MAAM,QAAQ;AAC1C;AAWO,SAAS,YAAY,KAAa,KAAa;AACrD,SAAO,KAAK,OAAO,KAAK,MAAM,OAAO;AACtC;AAWO,SAAS,eAAe,KAAa,KAAa;AACxD,SAAO,CAAC,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,CAAC,KAAK,MAAM,QAAQ;AACvD;AAWO,SAAS,MAAM,KAAa,MAAM,GAAG;AAE3C,QAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,SAAO,CAAC,EAAE,MAAM,MAAM,UAAU;AACjC;AAcO,SAAS,YAAY,UAAkB,QAAgB,YAAY,GAAG;AAC5E,SAAO,KAAK,IAAI,WAAW,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI;AACjE;AAOO,SAAS,IAAI,GAAW;AAC9B,SAAO,KAAK,IAAI,GAAG,CAAC;AACrB;;;ACrLO,IAAM,WAAN,MAAM,UAAS;AAAA,EACrB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,IAAwB,GAAG,IAAwB,GAAG;AACjE,SAAK,IAAI;AACT,SAAK,IAAI;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAI,GAAG,IAAI,GAAG;AAI1B,SAAK,IAAI;AAIT,SAAK,IAAI;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,GAAW,GAAW;AACzB,SAAK,IAAI;AACT,SAAK,IAAI;AACT,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,IAAI,GAAG,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAa;AAChB,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAa;AAChB,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAW,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAW;AACd,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AACL,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAa,MAAc;AAChC,WAAO,IAAI,UAAS,MAAM,KAAK,GAAG,KAAK,IAAI,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAa,MAAc;AACpC,WAAO,KAAK,IAAI,MAAM,KAAK,GAAG,KAAK,IAAI,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,IAAI,UAAS,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,IAAI,UAAS,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,IAAI,UAAS,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,MAA+C;AACxD,QAAI,KAAK,WAAW,GAAG;AACtB,aAAO,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,IAC/C;AACA,WAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,MAAM,KAAK,CAAC,EAAE;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAa;AAClC,QAAI,KAAK;AACT,QAAI,KAAK;AAET,QAAI,GAAG;AACN,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACR;AAEA,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,KAAK,IAAI;AAEnB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AAExB,WAAO,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAa;AAChB,WAAO,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAa;AAClB,WAAO,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,IAAI,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,KAAK,KAAK,QAAQ,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,GAAaC,QAAe;AAChC,SAAK,MAAM,EAAE,IAAI,KAAK,KAAKA;AAC3B,SAAK,MAAM,EAAE,IAAI,KAAK,KAAKA;AAC3B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAkB,MAAc;AAC3C,UAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC;AAE7D,UAAM,WAAW,KAAK,SAAS,MAAM;AAErC,QAAI,aAAa,KAAM,QAAQ,KAAK,YAAY,OAAO,MAAO;AAC7D,aAAO;AAAA,IACR;AAEA,SAAK,KAAK,KAAK,IAAI,KAAK,IAAI;AAC5B,SAAK,KAAK,KAAK,IAAI,KAAK,IAAI;AAE5B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,GAAa;AACrB,UAAM,KAAK,KAAK,IAAI,EAAE;AACtB,UAAM,KAAK,KAAK,IAAI,EAAE;AACtB,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAa;AAClB,WAAO,KAAK,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,GAAa;AACpB,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAa;AACrB,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,aAAa,IAAI,KAAK,GAAG,KAAK,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,EAC/B;AACD;AAEO,IAAM,eAAe,WAG1B,CAAC,GAAG,MAAM;AACX,QAAM,SAAS,IAAI,SAAS,GAAG,CAAC;AAEhC,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,KAAI,GAAGC,KAAI,GAAG;AACnB,aAAO,IAAID;AACX,aAAO,IAAIC;AAAA,IACZ;AAAA,EACD;AACD,CAAC;;;AC5aM,IAAM,QAAN,MAAM,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EAEA,YAAY,GAAY,GAAY;AACnC,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,SAAK,OAAO;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAI,GAAG,IAAI,GAAG;AACjB,SAAK,IAAI;AACT,SAAK,IAAI;AACT,WAAO;AAAA,EACR;AAAA,EAWA,OAAO,UAA0B,GAAY;AAC5C,QAAI,OAAO,aAAa,UAAU;AACjC,aAAO,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS;AAAA,IACrD;AACA,WAAO,KAAK,MAAM,YAAY,KAAK,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,IAAI,OAAM,KAAK,GAAG,KAAK,CAAC;AAAA,EAChC;AACD;AAEO,IAAM,YAAY,WAGvB,CAAC,GAAG,MAAM;AACX,QAAM,WAAW,IAAI,MAAM,GAAG,CAAC;AAE/B,SAAO;AAAA,IACN;AAAA,IACA,MAAMC,KAAI,GAAGC,KAAI,GAAG;AACnB,eAAS,IAAID;AACb,eAAS,IAAIC;AAAA,IACd;AAAA,EACD;AACD,CAAC;;;ACtEM,IAAM,SAAN,MAAM,QAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAA6C;AACxD,SAAK,UAAU,IAAI,SAAS;AAC5B,SAAK,OAAO;AACZ,SAAK,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS;AACtC,SAAK,MAAM,EAAE,GAAG,WAAW,GAAG,UAAU;AACxC,QAAI,UAAU;AACb,WAAK,OAAO,QAAQ;AAAA,IACrB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,SAAK,UAAU,UAAU,UAAU,WAAW,SAAS;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,MAAc,MAAc,MAAc,MAAc;AACjE,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI;AAEb,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAI;AACP,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAO;AACZ,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI;AACrC,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAI;AACP,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAO;AACZ,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI;AAErC,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAM,OAAO;AAChB,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAO,OAAO;AACjB,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAO;AACV,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAM;AACT,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU;AACb,WAAO,KAAK,IAAI,IAAI,KAAK,QAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU;AACb,WAAO,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,KAAK,QAAQ,IAAI,KAAK,SAAS,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAW,GAAW;AAC9B,SAAK,MAAM,IAAI,KAAK,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC;AAClD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAA4C;AAClD,SAAK,IAAI,UAAU,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAA4C,QAAQ,OAAO;AAC9D,QAAI,OAAO;AACV,WAAK,MAAM;AAAA,IACZ;AACA,eAAW,UAAU,UAAU;AAC9B,UAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAC1B,aAAK,IAAI,IAAI,OAAO;AAAA,MACrB;AACA,UAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAC1B,aAAK,IAAI,IAAI,OAAO;AAAA,MACrB;AACA,UAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAC1B,aAAK,IAAI,IAAI,OAAO;AAAA,MACrB;AACA,UAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAC1B,aAAK,IAAI,IAAI,OAAO;AAAA,MACrB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,QAAgB,QAAQ,OAAO;AACxC,QAAI,OAAO;AACV,WAAK,IAAI,IAAI,OAAO,IAAI;AACxB,WAAK,IAAI,IAAI,OAAO,IAAI;AACxB,WAAK,IAAI,IAAI,OAAO,IAAI;AACxB,WAAK,IAAI,IAAI,OAAO,IAAI;AAAA,IACzB,OAAO;AACN,UAAI,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG;AAC9B,aAAK,IAAI,IAAI,OAAO,IAAI;AAAA,MACzB;AACA,UAAI,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG;AAC9B,aAAK,IAAI,IAAI,OAAO,IAAI;AAAA,MACzB;AACA,UAAI,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG;AAC9B,aAAK,IAAI,IAAI,OAAO,IAAI;AAAA,MACzB;AACA,UAAI,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG;AAC9B,aAAK,IAAI,IAAI,OAAO,IAAI;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAyB,GAAc;AAC/C,UAAM,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI;AAC/B,SAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACrC,SAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACrC,SAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACrC,SAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,IAAY,IAAY,IAAY,IAAY,GAAc;AACtE,UAAM,IAAI,UAAU,IAAI;AAExB,SAAK,SAAS,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC;AAC9B,SAAK,SAAS,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC;AAC9B,SAAK,SAAS,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC;AAC9B,SAAK,SAAS,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC;AAE9B,cAAU,QAAQ,CAAC;AAAA,EACpB;AAAA,EAUA,SAAS,mBAA+C,GAAY;AACnE,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,6BAA6B,UAAU;AAC1C,YAAM,MAAM,kBAAkB;AAC9B,YAAM,MAAM,kBAAkB;AAAA,IAC/B,WAAW,6BAA6B,SAAQ;AAC/C,YAAM,kBAAkB,IAAI;AAC5B,YAAM,kBAAkB,IAAI;AAC5B,YAAM,kBAAkB,IAAI;AAC5B,YAAM,kBAAkB,IAAI;AAAA,IAC7B,OAAO;AACN,YAAM,MAAM;AACZ,YAAM,MAAM;AAAA,IACb;AAEA,WACC,OAAO,KAAK,IAAI,KAChB,OAAO,KAAK,IAAI,KAChB,OAAO,KAAK,IAAI,KAChB,OAAO,KAAK,IAAI;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,QAAgB;AACxB,WAAO,EACN,KAAK,QAAQ,OAAO,QACpB,KAAK,OAAO,OAAO,SACnB,KAAK,SAAS,OAAO,OACrB,KAAK,MAAM,OAAO;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WACC,SAAS,KAAK,IAAI,CAAC,KACnB,SAAS,KAAK,IAAI,CAAC,KACnB,SAAS,KAAK,IAAI,CAAC,KACnB,SAAS,KAAK,IAAI,CAAC;AAAA,EAErB;AAAA,EASA,UAAU,WAA8B,GAAY;AACnD,QAAI;AACJ,QAAI;AACJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AACA,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AAAA,EACf;AAAA,EASA,MAAM,WAA8B,GAAY;AAC/C,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAEA,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI;AACrC,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI;AAErC,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI,KAAK;AAClB,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,UAAM,SAAS,IAAI,QAAO;AAC1B,WAAO,UAAU,IAAI;AACrB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,YAAY,IAAI,KAAK,GAAG,KAAK,GAAG;AAAA,MACtC,IAAI,SAAS,GAAG,CAAC;AAAA,MACjB,IAAI,SAAS,KAAK,OAAO,CAAC;AAAA,MAC1B,IAAI,SAAS,KAAK,OAAO,KAAK,MAAM;AAAA,MACpC,IAAI,SAAS,GAAG,KAAK,MAAM;AAAA,IAC5B,CAAC;AAAA,EACF;AACD;AAKO,IAAM,aAAa,WAGxB,CAAC,aAAa;AACf,QAAM,WAAW,IAAI,OAAO,QAAQ;AACpC,SAAO;AAAA,IACN;AAAA,IACA,MAAMC,WAAU;AACf,eAAS,MAAM;AACf,UAAIA,WAAU;AACb,iBAAS,OAAOA,SAAQ;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD,CAAC;;;ACjbM,SAAS,OACfC,OACA,aACA,MAA0B,GACf;AACX,QAAM,WAAW,eAAe,YAAY;AAC5C,QAAM,WAAW,WAAW,YAAY,CAAC,IAAI,MAAMA,MAAK;AACxD,MAAI,YAAY,WAAWA,OAAM,GAAG,UAAU,KAAK,IAAI;AACvD,QAAM,YAAsB,CAAC;AAE7B,MAAI,CAAC,aAAa,UAAU,SAAS,UAAU,KAAM,QAAO;AAE5D,MAAI,MAAM,MAAM;AAEhB,MAAI,SAAU,aAAY,eAAeA,OAAM,aAAa,WAAW,GAAG;AAG1E,MAAIA,MAAK,SAAS,KAAK,KAAK;AAC3B,WAAO;AACP,WAAO;AACP,QAAI,OAAO;AACX,QAAI,OAAO;AAEX,aAAS,IAAI,KAAK,IAAI,UAAU,KAAK,KAAK;AACzC,YAAM,IAAIA,MAAK,CAAC;AAChB,YAAM,IAAIA,MAAK,IAAI,CAAC;AACpB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AAAA,IACtB;AAGA,cAAU,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI;AAC3C,cAAU,YAAY,IAAI,QAAQ,UAAU;AAAA,EAC7C;AAEA,eAAa,WAAW,WAAW,KAAK,MAAM,MAAM,SAAS,CAAC;AAE9D,SAAO;AACR;AAGA,SAAS,WACRA,OACA,OACA,KACA,KACA,WACC;AACD,MAAI,OAAoB;AAExB,MAAI,cAAc,WAAWA,OAAM,OAAO,KAAK,GAAG,IAAI,GAAG;AACxD,aAAS,IAAI,OAAO,IAAI,KAAK,KAAK,KAAK;AACtC,aAAO,WAAY,IAAI,MAAO,GAAGA,MAAK,CAAC,GAAGA,MAAK,IAAI,CAAC,GAAG,IAAI;AAAA,IAC5D;AAAA,EACD,OAAO;AACN,aAAS,IAAI,MAAM,KAAK,KAAK,OAAO,KAAK,KAAK;AAC7C,aAAO,WAAY,IAAI,MAAO,GAAGA,MAAK,CAAC,GAAGA,MAAK,IAAI,CAAC,GAAG,IAAI;AAAA,IAC5D;AAAA,EACD;AAEA,MAAI,QAAQ,OAAO,MAAM,KAAK,IAAI,GAAG;AACpC,eAAW,IAAI;AACf,WAAO,KAAK;AAAA,EACb;AAEA,SAAO;AACR;AAKA,SAAS,aAAa,OAAoB,KAAmB;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,IAAK,OAAM;AAEhB,MAAI,IAAI,OACP;AACD,KAAG;AACF,YAAQ;AAER,QAAI,CAAC,EAAE,YAAY,OAAO,GAAG,EAAE,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,IAAI;AACvE,iBAAW,CAAC;AACZ,UAAI,MAAM,EAAE;AACZ,UAAI,MAAM,EAAE,KAAM;AAClB,cAAQ;AAAA,IACT,OAAO;AACN,UAAI,EAAE;AAAA,IACP;AAAA,EACD,SAAS,SAAS,MAAM;AAExB,SAAO;AACR;AAGA,SAAS,aACR,KACA,WACA,KACA,MACA,MACA,SACA,MACC;AACD,MAAI,CAAC,IAAK;AAGV,MAAI,CAAC,QAAQ,QAAS,YAAW,KAAK,MAAO,MAAO,OAAO;AAE3D,MAAIC,QAAO;AAGX,SAAO,IAAI,SAAS,IAAI,MAAM;AAC7B,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,IAAI;AAEjB,QAAI,UAAU,YAAY,KAAK,MAAO,MAAO,OAAO,IAAI,MAAM,GAAG,GAAG;AACnE,gBAAU,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAEpC,iBAAW,GAAG;AAGd,YAAM,KAAK;AACX,MAAAA,QAAO,KAAK;AAEZ;AAAA,IACD;AAEA,UAAM;AAGN,QAAI,QAAQA,OAAM;AAEjB,UAAI,CAAC,MAAM;AACV,qBAAa,aAAa,GAAG,GAAG,WAAW,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,MAGvE,WAAW,SAAS,GAAG;AACtB,cAAM,uBAAuB,aAAa,GAAG,GAAG,SAAS;AACzD,qBAAa,KAAK,WAAW,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,MAGzD,WAAW,SAAS,GAAG;AACtB,oBAAY,KAAK,WAAW,KAAK,MAAM,MAAM,OAAO;AAAA,MACrD;AAEA;AAAA,IACD;AAAA,EACD;AACD;AAGA,SAAS,MAAM,KAAW;AACzB,QAAM,IAAI,IAAI,MACb,IAAI,KACJ,IAAI,IAAI;AAET,MAAI,KAAK,GAAG,GAAG,CAAC,KAAK,EAAG,QAAO;AAG/B,QAAM,KAAK,EAAE,GACZ,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE;AAGR,QAAM,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACzD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACpD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACpD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK;AAErD,MAAI,IAAI,EAAE;AACV,SAAO,MAAM,GAAG;AACf,QACC,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,KAChD,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAE3B,aAAO;AACR,QAAI,EAAE;AAAA,EACP;AAEA,SAAO;AACR;AAEA,SAAS,YAAY,KAAW,MAAc,MAAc,SAAiB;AAC5E,QAAM,IAAI,IAAI,MACb,IAAI,KACJ,IAAI,IAAI;AAET,MAAI,KAAK,GAAG,GAAG,CAAC,KAAK,EAAG,QAAO;AAE/B,QAAM,KAAK,EAAE,GACZ,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE;AAGR,QAAM,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACzD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACpD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,IACpD,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK;AAGrD,QAAM,OAAO,OAAO,IAAI,IAAI,MAAM,MAAM,OAAO,GAC9C,OAAO,OAAO,IAAI,IAAI,MAAM,MAAM,OAAO;AAE1C,MAAI,IAAI,IAAI,OACX,IAAI,IAAI;AAGT,SAAO,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE,KAAK,MAAM;AAC5C,QACC,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,MAAM,KACN,MAAM,KACN,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,KAChD,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAE3B,aAAO;AACR,QAAI,EAAE;AAEN,QACC,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,MAAM,KACN,MAAM,KACN,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,KAChD,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAE3B,aAAO;AACR,QAAI,EAAE;AAAA,EACP;AAGA,SAAO,KAAK,EAAE,KAAK,MAAM;AACxB,QACC,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,MAAM,KACN,MAAM,KACN,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,KAChD,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAE3B,aAAO;AACR,QAAI,EAAE;AAAA,EACP;AAGA,SAAO,KAAK,EAAE,KAAK,MAAM;AACxB,QACC,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,EAAE,KAAK,MACP,MAAM,KACN,MAAM,KACN,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,KAChD,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAE3B,aAAO;AACR,QAAI,EAAE;AAAA,EACP;AAEA,SAAO;AACR;AAGA,SAAS,uBAAuB,OAAa,WAAqB;AACjE,MAAI,IAAI;AACR,KAAG;AACF,UAAM,IAAI,EAAE,MACX,IAAI,EAAE,KAAK;AAEZ,QACC,CAAC,OAAO,GAAG,CAAC,KACZ,WAAW,GAAG,GAAG,EAAE,MAAM,CAAC,KAC1B,cAAc,GAAG,CAAC,KAClB,cAAc,GAAG,CAAC,GACjB;AACD,gBAAU,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAG5B,iBAAW,CAAC;AACZ,iBAAW,EAAE,IAAI;AAEjB,UAAI,QAAQ;AAAA,IACb;AACA,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,SAAO,aAAa,CAAC;AACtB;AAGA,SAAS,YACR,OACA,WACA,KACA,MACA,MACA,SACC;AAED,MAAI,IAAI;AACR,KAAG;AACF,QAAI,IAAI,EAAE,KAAK;AACf,WAAO,MAAM,EAAE,MAAM;AACpB,UAAI,EAAE,MAAM,EAAE,KAAK,gBAAgB,GAAG,CAAC,GAAG;AAEzC,YAAI,IAAI,aAAa,GAAG,CAAC;AAGzB,YAAI,aAAa,GAAG,EAAE,IAAI;AAC1B,YAAI,aAAa,GAAG,EAAE,IAAI;AAG1B,qBAAa,GAAG,WAAW,KAAK,MAAM,MAAM,SAAS,CAAC;AACtD,qBAAa,GAAG,WAAW,KAAK,MAAM,MAAM,SAAS,CAAC;AACtD;AAAA,MACD;AACA,UAAI,EAAE;AAAA,IACP;AACA,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAChB;AAGA,SAAS,eACRD,OACA,aACA,WACA,KACC;AACD,QAAM,QAAQ,CAAC;AAEf,WAAS,IAAI,GAAG,MAAM,YAAY,QAAQ,IAAI,KAAK,KAAK;AACvD,UAAM,QAAQ,YAAY,CAAC,IAAI;AAC/B,UAAM,MAAM,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,IAAI,MAAMA,MAAK;AAC1D,UAAM,OAAO,WAAWA,OAAM,OAAO,KAAK,KAAK,KAAK;AACpD,QAAI,SAAS,KAAK,KAAM,MAAK,UAAU;AACvC,UAAM,KAAK,YAAY,IAAI,CAAC;AAAA,EAC7B;AAEA,QAAM,KAAK,QAAQ;AAGnB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,gBAAY,cAAc,MAAM,CAAC,GAAG,SAAS;AAAA,EAC9C;AAEA,SAAO;AACR;AAEA,SAAS,SAAS,GAAS,GAAS;AACnC,SAAO,EAAE,IAAI,EAAE;AAChB;AAGA,SAAS,cAAc,MAAY,WAAiB;AACnD,QAAM,SAAS,eAAe,MAAM,SAAS;AAC7C,MAAI,CAAC,QAAQ;AACZ,WAAO;AAAA,EACR;AAEA,QAAM,gBAAgB,aAAa,QAAQ,IAAI;AAG/C,eAAa,eAAe,cAAc,IAAI;AAC9C,SAAO,aAAa,QAAQ,OAAO,IAAI;AACxC;AAGA,SAAS,eAAe,MAAY,WAAiB;AACpD,MAAI,IAAI;AACR,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,MAAI,KAAK;AACT,MAAI;AAIJ,KAAG;AACF,QAAI,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,GAAG;AACpD,YAAM,IAAI,EAAE,KAAM,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,MAAO,EAAE,KAAK,IAAI,EAAE;AAChE,UAAI,KAAK,MAAM,IAAI,IAAI;AACtB,aAAK;AACL,YAAI,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE;AAC3B,YAAI,MAAM,GAAI,QAAO;AAAA,MACtB;AAAA,IACD;AACA,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,MAAI,CAAC,EAAG,QAAO;AAMf,QAAMC,QAAO;AACb,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,EAAE;AACb,MAAI,SAAS;AAEb,MAAI;AAEJ,KAAG;AACF,QACC,MAAM,EAAE,KACR,EAAE,KAAK,MACP,OAAO,EAAE,KACT;AAAA,MACC,KAAK,KAAK,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,KAAK,KAAK;AAAA,MACf;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,IACH,GACC;AACD,YAAM,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE;AAEzC,UACC,cAAc,GAAG,IAAI,MACpB,MAAM,UACL,QAAQ,WACP,EAAE,IAAI,EAAE,KAAM,EAAE,MAAM,EAAE,KAAK,qBAAqB,GAAG,CAAC,KACxD;AACD,YAAI;AACJ,iBAAS;AAAA,MACV;AAAA,IACD;AAEA,QAAI,EAAE;AAAA,EACP,SAAS,MAAMA;AAEf,SAAO;AACR;AAGA,SAAS,qBAAqB,GAAS,GAAS;AAC/C,SAAO,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI;AACjE;AAGA,SAAS,WAAW,OAAa,MAAc,MAAc,SAAiB;AAC7E,MAAI,IAAI;AACR,KAAG;AACF,QAAI,EAAE,MAAM,EAAG,GAAE,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,OAAO;AACzD,MAAE,QAAQ,EAAE;AACZ,MAAE,QAAQ,EAAE;AACZ,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,IAAE,MAAO,QAAQ;AACjB,IAAE,QAAQ;AAEV,aAAW,CAAC;AACb;AAIA,SAAS,WAAW,MAAY;AAC/B,MAAI;AACJ,MAAI,SAAS;AAEb,MAAI,OAAoB;AAExB,KAAG;AACF,QAAI,IAAiB;AACrB,QAAI;AACJ,WAAO;AACP,QAAI,OAAO;AACX,gBAAY;AAEZ,WAAO,GAAG;AACT;AACA,UAAI,IAAiB;AACrB,UAAI,QAAQ;AACZ,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAChC;AACA,YAAI,EAAE;AACN,YAAI,CAAC,EAAG;AAAA,MACT;AACA,UAAI,QAAQ;AAEZ,aAAO,QAAQ,KAAM,QAAQ,KAAK,GAAI;AACrC,YAAI,UAAU,MAAM,UAAU,KAAK,CAAC,KAAK,EAAG,KAAK,EAAE,IAAI;AACtD,cAAI;AACJ,cAAI,EAAG;AACP;AAAA,QACD,OAAO;AACN,cAAI;AACJ,cAAI,EAAG;AACP;AAAA,QACD;AAEA,YAAI,MAAM;AACT,eAAK,QAAQ;AAAA,QACd,OAAO;AACN,iBAAO;AAAA,QACR;AAEA,UAAE,QAAQ;AACV,eAAO;AAAA,MACR;AAEA,UAAI;AAAA,IACL;AAEA,SAAM,QAAQ;AACd,cAAU;AAAA,EACX,SAAS,YAAY;AAErB,SAAO;AACR;AAGA,SAAS,OACR,GACA,GACA,MACA,MACA,SACC;AAED,OAAM,IAAI,QAAQ,UAAW;AAC7B,OAAM,IAAI,QAAQ,UAAW;AAE7B,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AAErB,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AACrB,OAAK,IAAK,KAAK,KAAM;AAErB,SAAO,IAAK,KAAK;AAClB;AAGA,SAAS,YAAY,OAAa;AACjC,MAAI,IAAI,OACP,WAAW;AACZ,KAAG;AACF,QAAI,EAAE,IAAI,SAAS,KAAM,EAAE,MAAM,SAAS,KAAK,EAAE,IAAI,SAAS;AAC7D,iBAAW;AACZ,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,SAAO;AACR;AAGA,SAAS,gBACR,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACC;AACD,UACE,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,QAC1C,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,QAC1C,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK;AAE7C;AAGA,SAAS,gBAAgB,GAAS,GAAS;AAC1C,SACC,EAAE,KAAK,MAAM,EAAE,KACf,EAAE,KAAK,MAAM,EAAE,KACf,CAAC,kBAAkB,GAAG,CAAC;AAAA,GACrB,cAAc,GAAG,CAAC,KACnB,cAAc,GAAG,CAAC,KAClB,aAAa,GAAG,CAAC;AAAA,GAChB,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK,KAAK,GAAG,EAAE,MAAM,CAAC;AAAA,EAC5C,OAAO,GAAG,CAAC,KACX,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI,KAC1B,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI;AAE9B;AAGA,SAAS,KAAK,GAAS,GAAS,GAAS;AACxC,UAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAC3D;AAGA,SAAS,OAAO,IAAU,IAAU;AACnC,SAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;AACrC;AAGA,SAAS,WAAW,IAAU,IAAU,IAAU,IAAU;AAC3D,QAAM,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;AAChC,QAAM,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;AAChC,QAAM,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;AAChC,QAAM,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;AAEhC,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAEnC,MAAI,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,EAAG,QAAO;AAC9C,MAAI,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,EAAG,QAAO;AAC9C,MAAI,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,EAAG,QAAO;AAC9C,MAAI,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,EAAG,QAAO;AAE9C,SAAO;AACR;AAGA,SAAS,UAAU,GAAS,GAAS,GAAS;AAC7C,SACC,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,KACxB,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,KACxB,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,KACxB,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAE1B;AAEA,SAAS,KAAK,KAAa;AAC1B,SAAO,MAAM,IAAI,IAAI,MAAM,IAAI,KAAK;AACrC;AAGA,SAAS,kBAAkB,GAAS,GAAS;AAC5C,MAAI,IAAI;AACR,KAAG;AACF,QACC,EAAE,MAAM,EAAE,KACV,EAAE,KAAK,MAAM,EAAE,KACf,EAAE,MAAM,EAAE,KACV,EAAE,KAAK,MAAM,EAAE,KACf,WAAW,GAAG,EAAE,MAAM,GAAG,CAAC;AAE1B,aAAO;AACR,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,SAAO;AACR;AAGA,SAAS,cAAc,GAAS,GAAS;AACxC,SAAO,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI,IAC9B,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,KAAK,KAAK,GAAG,EAAE,MAAM,CAAC,KAAK,IACjD,KAAK,GAAG,GAAG,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,MAAM,CAAC,IAAI;AACnD;AAGA,SAAS,aAAa,GAAS,GAAS;AACvC,MAAI,IAAI;AACR,MAAI,SAAS;AACb,QAAM,MAAM,EAAE,IAAI,EAAE,KAAK;AACzB,QAAM,MAAM,EAAE,IAAI,EAAE,KAAK;AACzB,KAAG;AACF,QACC,EAAE,IAAI,OAAO,EAAE,KAAK,IAAI,MACxB,EAAE,KAAK,MAAM,EAAE,KACf,MAAO,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,EAAE,MAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE;AAE5D,eAAS,CAAC;AACX,QAAI,EAAE;AAAA,EACP,SAAS,MAAM;AAEf,SAAO;AACR;AAIA,SAAS,aAAa,GAAS,GAAS;AACvC,QAAM,KAAK,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAClC,KAAK,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAC7B,KAAK,EAAE,MACP,KAAK,EAAE;AAER,IAAE,OAAO;AACT,IAAE,OAAO;AAET,KAAG,OAAO;AACV,KAAG,OAAO;AAEV,KAAG,OAAO;AACV,KAAG,OAAO;AAEV,KAAG,OAAO;AACV,KAAG,OAAO;AAEV,SAAO;AACR;AAGA,SAAS,WAAW,GAAW,GAAW,GAAW,MAAmB;AACvE,QAAM,IAAI,WAAW,GAAG,GAAG,CAAC;AAE5B,MAAI,CAAC,MAAM;AACV,MAAE,OAAO;AACT,MAAE,OAAO;AAAA,EACV,OAAO;AACN,MAAE,OAAO,KAAK;AACd,MAAE,OAAO;AACT,SAAK,KAAK,OAAO;AACjB,SAAK,OAAO;AAAA,EACb;AACA,SAAO;AACR;AAEA,SAAS,WAAW,GAAS;AAC5B,IAAE,KAAK,OAAO,EAAE;AAChB,IAAE,KAAK,OAAO,EAAE;AAEhB,MAAI,EAAE,MAAO,GAAE,MAAM,QAAQ,EAAE;AAC/B,MAAI,EAAE,MAAO,GAAE,MAAM,QAAQ,EAAE;AAChC;AAmBA,SAAS,WAAW,GAAW,GAAW,GAAsB;AAC/D,SAAO;AAAA,IACN;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA,MAAM;AAAA;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA;AAAA,IACH,OAAO;AAAA;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA;AAAA,EACV;AACD;AAEO,SAAS,WACfD,OACA,OACA,KACA,KACC;AACD,MAAI,MAAM;AACV,WAAS,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK;AACrD,YAAQA,MAAK,CAAC,IAAIA,MAAK,CAAC,MAAMA,MAAK,IAAI,CAAC,IAAIA,MAAK,IAAI,CAAC;AACtD,QAAI;AAAA,EACL;AACA,SAAO;AACR;;;ACrvBO,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ;AAAA;AAAA;AAAA;AAAA,EAKR,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,YAAY,IAAI,GAAG,IAAI,GAAG,UAA0C;AACnE,SAAK,MAAM,aAAa,IAAI,GAAG,CAAC;AAChC,SAAK,SAAS,CAAC;AACf,SAAK,QAAQ,CAAC;AACd,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU,WAAW,IAAI;AAC9B,SAAK,YAAY,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,GAAW,GAAW,QAAwC;AACtE,SAAK,IAAI,IAAI,GAAG,CAAC;AACjB,SAAK,YAAY,MAAM;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,UAA0C;AACrD,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC7B,aAAO;AAAA,IACR;AAEA,QAAI,SAAS,SAAS,GAAG;AACxB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IACzD;AAEA,QAAI,OAAO,SAAS,CAAC,MAAM,UAAU;AACpC,WAAK,SAAS,CAAC;AACf,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC5C,aAAK,OAAO;AAAA,UACX,IAAI;AAAA,YACF,SAAsB,CAAC;AAAA,YACvB,SAAsB,IAAI,CAAC;AAAA,UAC7B;AAAA,QACD;AAAA,MACD;AAAA,IACD,WAAW,SAAS,CAAC,aAAa,UAAU;AAC3C,WAAK,SAAS;AAAA,IACf,OAAO;AACN,WAAK,SAAS,CAAC;AACf,iBAAW,UAAU,UAAuB;AAC3C,aAAK,OAAO,KAAK,IAAI,SAAS,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,MAClD;AAAA,IACD;AAEA,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAa;AACtB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AACnB,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,QAAE,MAAM,OAAO,CAAC,CAAC;AAAA,IAClB;AACA,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,OAAO,KAAK,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,MAAM,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAwB;AAC7C,QAAI,UAAU,GAAG;AAChB,YAAM,SAAS,KAAK;AACpB,YAAM,MAAM,OAAO;AACnB,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,eAAO,CAAC,EAAE,OAAO,OAAO,CAAC;AAAA,MAC1B;AACA,WAAK,OAAO;AACZ,WAAK,aAAa;AAAA,IACnB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAW,IAAI,GAAG;AACvB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AACnB,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,aAAO,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,IACrB;AACA,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS;AACR,UAAM,QAAQ,KAAK;AACnB,UAAM,UAAU,KAAK;AACrB,UAAM,UAAU,KAAK;AAGrB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AAEnB,QAAI,MAAM,GAAG;AACZ,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC7C;AAGA,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,UAAI,OAAO,MAAM,CAAC;AAClB,UAAI,OAAO,SAAS,aAAa;AAChC,eAAO,MAAM,CAAC,IAAI,aAAa,IAAI;AAAA,MACpC;AACA,WAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC;AAE9C,UAAI,SAAS,QAAQ,CAAC;AACtB,UAAI,OAAO,WAAW,aAAa;AAClC,iBAAS,QAAQ,CAAC,IAAI,aAAa,IAAI;AAAA,MACxC;AACA,aAAO,KAAK,IAAI,EAAE,KAAK,EAAE,UAAU;AAAA,IACpC;AAGA,aAAS,IAAI,KAAK,IAAI,MAAM,QAAQ,KAAK;AACxC,mBAAa,QAAQ,MAAM,CAAC,CAAC;AAC7B,mBAAa,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAChC;AAGA,UAAM,SAAS;AACf,YAAQ,SAAS;AAIjB,YAAQ,SAAS;AAEjB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,WAAK,UAAU;AAAA,QACd,KAAK,OAAO,QAAQ,CAAC,MAAM;AAC1B,iBAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAAA,QACjB,CAAC;AAAA,MACF;AAAA,IACD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AAIV,QAAI,OAAO;AACX,UAAM,WAAW,KAAK;AACtB,UAAM,IAAI,SAAS;AAEnB,QAAI,IAAI,GAAG;AACV,aAAO;AAAA,IACR;AAEA,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAM,KAAK,IAAI,KAAK;AACpB,YAAM,KAAK,IAAI,KAAK;AACpB,UAAI,KAAK,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE,MAAM,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE;AACvE,YAAM,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE,MAAM,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE;AAEpE,UAAI,IAAI,GAAG;AACV,gBAAQ;AAAA,MACT,WAAW,IAAI,GAAG;AACjB,gBAAQ;AAAA,MACT;AAEA,UAAI,SAAS,GAAG;AACf,eAAO;AAAA,MACR;AAAA,IACD;AAEA,QAAI,SAAS,GAAG;AACf,aAAO;AAAA,IACR,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAcA,UAAU,WAA8B,GAAY;AACnD,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAEA,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,SAAK,UAAU,EAAE,UAAU,IAAI,EAAE;AAEjC,WAAO;AAAA,EACR;AAAA,EAaA,MAAM,WAA8B,GAAY;AAC/C,QAAI;AACJ,QAAI;AACJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AACA,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI;AACb,SAAK,aAAa;AAAA,EACnB;AAAA,EAqBA,SAAS,WAA8B,GAAY;AAClD,UAAM,CAAC,IAAI,EAAE,IACZ,qBAAqB,WAClB,CAAC,UAAU,GAAG,UAAU,CAAC,IACzB,CAAC,WAAW,CAAE;AAElB,QAAIE,cAAa;AACjB,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AAGnB,aAAS,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,KAAK;AAC9C,YAAM,KAAK,OAAO,CAAC,EAAE,IAAI;AACzB,YAAM,KAAK,OAAO,CAAC,EAAE,IAAI;AACzB,YAAM,KAAK,OAAO,CAAC,EAAE,IAAI;AACzB,YAAM,KAAK,OAAO,CAAC,EAAE,IAAI;AACzB,UACC,KAAK,OAAO,KAAK,MACjB,MAAO,KAAK,OAAO,KAAK,OAAQ,KAAK,MAAM,IAC1C;AACD,QAAAA,cAAa,CAACA;AAAA,MACf;AAAA,IACD;AACA,WAAOA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO,OAAO,KAAK,MAAM;AACzB,WAAO,UAAU,KAAK,GAAG;AAEzB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,YAAY;AAAA,MAClB,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAAA,IAMzC;AAAA,EACD;AACD;AAEO,IAAM,cAAc,WAGzB,CAAC,GAAG,GAAG,aAAa;AACrB,QAAM,UAAU,IAAI,QAAQ,GAAG,GAAG,QAAQ;AAC1C,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,IAAGC,IAAG,QAAQ;AACnB,cAAQ,IAAI,IAAID,IAAGC,EAAC;AACpB,cAAQ,YAAY,MAAM;AAAA,IAC3B;AAAA,EACD;AACD,CAAC;;;AChdM,IAAM,OAAN,MAAM,cAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShB,YAAY,GAAW,GAAW,GAAW,GAAW;AACvD,UAAM,GAAG,GAAG;AAAA,MACX,aAAa,IAAI,GAAG,CAAC;AAAA;AAAA,MACrB,aAAa,IAAI,GAAG,CAAC;AAAA;AAAA,MACrB,aAAa,IAAI,GAAG,CAAC;AAAA;AAAA,MACrB,aAAa,IAAI,GAAG,CAAC;AAAA;AAAA,IACtB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,OAAe,QAAgB;AACtC,SAAK,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC;AACvB,SAAK,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC;AAC3B,SAAK,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM;AAChC,SAAK,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM;AAC5B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAO;AACV,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACX,UAAM,IAAI,KAAK;AACf,WAAO,KAAK,OAAO,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAM;AACT,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACZ,UAAM,IAAI,KAAK;AACf,WAAO,KAAK,MAAM,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACX,WAAO,KAAK,OAAO,CAAC,EAAE;AAAA,EACvB;AAAA,EACA,IAAI,MAAM,OAAO;AAChB,SAAK,OAAO,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI;AACtC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACZ,WAAO,KAAK,OAAO,CAAC,EAAE;AAAA,EACvB;AAAA,EACA,IAAI,OAAO,OAAO;AACjB,SAAK,OAAO,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI;AACtC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACb,QAAI,SAAS,KAAK,KAAK,GAAG;AACzB,aAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,IACjC,OAAO;AACN,aAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA,EACA,IAAI,QAAQ,OAAO;AAClB,SAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ;AAClC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACb,QAAI,SAAS,KAAK,MAAM,GAAG;AAC1B,aAAO,KAAK,MAAM,KAAK,SAAS;AAAA,IACjC,OAAO;AACN,aAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA,EACA,IAAI,QAAQ,OAAO;AAClB,SAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;AACnC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAW,GAAW;AAC9B,SAAK,UAAU;AACf,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAW,GAAW;AAC5B,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,MAAM,GAAW,IAAI,GAAG;AAChC,SAAK,SAAS;AACd,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,QAAQ;AAChB,WAAO,IAAI,MAAK,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAY;AAChB,SAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACnC,SAAK,QAAQ,KAAK,OAAO,KAAK,MAAM;AACpC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAY;AACjB,UAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI;AACxC,UAAM,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AAEtC,SAAK;AAAA,MACJ,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,IAAI;AAAA,MACnC,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI;AAAA,IACtC;AAEA,SAAK,IAAI,IAAI,IAAI,EAAE;AAEnB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAY;AACpB,WACC,KAAK,OAAO,KAAK,SACjB,KAAK,OAAO,KAAK,SACjB,KAAK,MAAM,KAAK,UAChB,KAAK,MAAM,KAAK;AAAA,EAElB;AAAA,EAIS,SAAS,WAA8B,GAAqB;AACpE,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,YAAM,MAAM,UAAU;AACtB,YAAM,MAAM,UAAU;AAAA,IACvB,OAAO;AACN,YAAM,MAAM;AACZ,YAAM,MAAM;AAAA,IACb;AACA,WACC,OAAO,KAAK,QACZ,OAAO,KAAK,SACZ,OAAO,KAAK,OACZ,OAAO,KAAK;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,kBAAkB,WAAiB;AAClC,WACC,UAAU,QAAQ,KAAK,QACvB,UAAU,SAAS,KAAK,SACxB,UAAU,OAAO,KAAK,OACtB,UAAU,UAAU,KAAK;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAY;AAClB,WACC,KAAK,SAAS,KAAK,QACnB,KAAK,UAAU,KAAK,SACpB,KAAK,QAAQ,KAAK,OAClB,KAAK,WAAW,KAAK;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WACC,SAAS,KAAK,IAAI,KAClB,SAAS,KAAK,GAAG,KACjB,SAAS,KAAK,KAAK,KACnB,SAAS,KAAK,MAAM;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,YAAY,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,MAAyB;AAAA,EAC3E;AACD;AAEO,IAAM,WAAW,WAGtB,CAAC,GAAG,GAAG,OAAO,WAAW;AAC1B,QAAM,YAAY,IAAI,KAAK,GAAG,GAAG,OAAO,MAAM;AAC9C,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,IAAGC,IAAGC,QAAOC,SAAQ;AAC1B,gBAAU,IAAI,IAAIH,IAAGC,EAAC;AACtB,gBAAU,QAAQC,QAAOC,OAAM;AAAA,IAChC;AAAA,EACD;AACD,CAAC;;;ACjTD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA,sBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,SAAS,WAAW,KAAa;AACvC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AACjD;AAOO,SAAS,UAAU,KAAa;AACtC,MAAI,OAAO,QAAQ,UAAU;AAC5B,UAAM,IAAI,KAAK;AAAA,EAChB;AACA,SAAO,CAAC,OAAO,MAAM,GAAG,KAAK,6BAA6B,KAAK,GAAG;AACnE;AAOO,SAAS,UAAU,KAAa;AACtC,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,YAAY,UAAU,YAAY;AAC1C;AAOO,SAAS,MAAM,KAAa;AAClC,MAAI,MAAM;AACV,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ;AACtB,WAAO,IAAI,WAAW,GAAG,EAAE,SAAS,EAAE;AAAA,EACvC;AACA,SAAO;AACR;AAQO,SAAS,UAAU,KAAa;AACtC,SAAO,0BAA0B,KAAK,GAAG;AAC1C;;;ADpDA,IAAM,UAAU,CAAC,MAAM,MAAM,OAAO,UAAU,GAAG;AAQ1C,SAAS,SAAS,MAAc,KAA+B;AACrE,QAAM,OAAO;AACb,MAAI,QAAQ,KAAK;AAChB,WAAO,IAAI,IAAI;AAAA,EAChB;AAEA,QAAM,UAAU,WAAW,IAAI;AAE/B,MAAI;AACJ,UAAQ,KAAK,CAAC,WAAW;AACxB,UAAMC,QAAO,SAAS;AACtB,WAAQ,SAASA,SAAQ,MAAM,IAAIA,KAAI,IAAI;AAAA,EAC5C,CAAC;AACD,SAAO;AACR;AASO,SAAS,YACf,MACA,OACA,KACC;AACD,QAAM,OAAO;AACb,MAAI,QAAQ,KAAK;AAChB,QAAI,IAAI,IAAI;AACZ;AAAA,EACD;AAEA,QAAM,UAAU,WAAW,IAAI;AAE/B,UAAQ,KAAK,CAAC,WAAW;AACxB,UAAMA,QAAO,SAAS;AACtB,QAAIA,SAAQ,KAAK;AAChB,UAAIA,KAAI,IAAI;AACZ,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,CAAC;AAED,SAAO;AACR;;;AE3DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAML,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,SAAS;AACV;;;AC5CO,IAAM,6BAA6B;AAAA,EACzC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa,aAAa;AAAA,EAC1B,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe,EAAE,wBAAwB;AAAA,EACzC,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,8BAA8B;AAAA,EAC9B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACT;;;ACpBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,eAAN,MAA6D;AAAA,EAC3D;AAAA,EACA;AAAA,EAER,cAAc;AACb,SAAK,iBAAiB,CAAC;AACvB,SAAK,qBAAqB,CAAC;AAAA,EAC5B;AAAA,EAEA,YAAoC,OAAU,UAAqB;AAClE,QAAI,oBAAoB,KAAK,eAAe,KAAK;AACjD,QAAI,CAAC,mBAAmB;AACvB,0BAAoB,CAAC;AACrB,WAAK,eAAe,KAAK,IAAI;AAAA,IAC9B;AACA,sBAAkB,KAAK,QAAQ;AAE/B,WAAO,MAAM;AACZ,WAAK,eAAe,OAAO,QAAQ;AAAA,IACpC;AAAA,EACD;AAAA,EAEA,gBAAwC,OAAU,UAAqB;AACtE,QAAI,oBAAoB,KAAK,mBAAmB,KAAK;AACrD,QAAI,CAAC,mBAAmB;AACvB,0BAAoB,CAAC;AACrB,WAAK,mBAAmB,KAAK,IAAI;AAAA,IAClC;AACA,sBAAkB,KAAK,QAAQ;AAAA,EAChC;AAAA,EAEA,mBAAmB,OAAsB;AACxC,QAAI,OAAO;AACV,aAAO,KAAK,eAAe,KAAK;AAAA,IACjC,OAAO;AACN,WAAK,iBAAiB,CAAC;AAAA,IACxB;AAAA,EACD;AAAA,EAEA,eAAuC,OAAU,UAAqB;AACrE,UAAM,YAAY,KAAK,eAAe,KAAK;AAC3C,QAAI,WAAW,SAAS,QAAQ,GAAG;AAClC,gBAAU,OAAO,UAAU,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAChD;AAEA,UAAM,gBAAgB,KAAK,mBAAmB,KAAK;AACnD,QAAI,eAAe,SAAS,QAAQ,GAAG;AACtC,oBAAc,OAAO,cAAc,QAAQ,QAAQ,GAAG,CAAC;AAAA,IACxD;AAAA,EACD;AAAA,EAEA,KAA6B,UAAa,MAA6B;AACtE,UAAM,YAAY,KAAK,eAAe,KAAK;AAC3C,QAAI,WAAW;AACd,iBAAW,YAAY,WAAW;AACjC,iBAAS,GAAG,IAAI;AAAA,MACjB;AAAA,IACD;AAEA,UAAM,gBAAgB,KAAK,mBAAmB,KAAK;AACnD,QAAI,eAAe;AAClB,iBAAW,YAAY,eAAe;AACrC,iBAAS,GAAG,IAAI;AAAA,MACjB;AACA,WAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACnC;AAAA,EACD;AAAA,EAEA,YAAoC,OAAU,UAAqB;AAClE,WACC,MAAM,KAAK,KAAK,eAAe,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,MACtD;AAAA,IACD,KACA,MAAM,KAAK,KAAK,mBAAmB,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,MAC1D;AAAA,IACD;AAAA,EAEF;AACD;;;ADvEO,IAAM,YAAY;AAMlB,IAAM,OAAO;AAMb,IAAM,OAAO;AAMb,IAAM,OAAO;AAMb,IAAM,QAAQ;AAOd,IAAM,cAAc;AAOpB,IAAM,eAAe;AAOrB,IAAM,aAAa;AAOnB,IAAM,gBAAgB;AAMtB,IAAM,eAAe;AAMrB,IAAM,cAAc;AAQpB,IAAM,aAAa;AAOnB,IAAM,YAAY;AAOlB,IAAM,aAAa;AAOnB,IAAM,qBAAqB;AAO3B,IAAM,oBAAoB;AAO1B,IAAM,cAAc;AAOpB,IAAM,mBAAmB;AAOzB,IAAM,kBAAkB;AAOxB,IAAM,aAAa;AAOnB,IAAM,eAAe;AAOrB,IAAM,kBAAkB;AAOxB,IAAM,kBAAkB;AAOxB,IAAM,eAAe;AA0BrB,IAAM,UAAU;AAmBhB,IAAM,QAAQ;AAOd,IAAM,oBAAoB;AAO1B,IAAM,uBAAuB;AAW7B,IAAM,iBAAiB;AAOvB,IAAM,cAAc;AAOpB,IAAM,oBAAoB;AAS1B,IAAM,YAAY;AASlB,IAAM,UAAU;AAOhB,IAAM,kBAAkB;AASxB,IAAM,kBAAkB;AAUxB,IAAM,oBAAoB;AAO1B,IAAM,8BAA8B;AAOpC,IAAM,kBAAkB;AAOxB,IAAM,oBAAoB;AAO1B,IAAM,iBAAiB;AAOvB,IAAM,qBAAqB;AAuD3B,IAAM,eAAe,IAAI,aAAqB;AAU9C,SAAS,GACf,WACA,UACA,SACC;AACD,eAAa;AAAA,IACZ;AAAA,IACA,UAAW,SAAS,KAAK,OAAO,IAAkB;AAAA,EACnD;AACD;AAUO,SAAS,KACf,WACA,UACA,SACC;AACD,eAAa;AAAA,IACZ;AAAA,IACA,UAAW,SAAS,KAAK,OAAO,IAAkB;AAAA,EACnD;AACD;AASO,SAAS,IAA4B,WAAc,UAAqB;AAC9E,eAAa,eAAe,WAAW,QAAQ;AAChD;;;AHvZO,IAAI,WAAW;AAkBf,SAAS,KAAK,OAAO,QAAQ,SAAS;AAE5C,MAAI,CAAC,aAAa;AACjB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAEA,MAAI;AAEH,SAAK;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO,OAAO,4BAA4B,WAAW,CAAC,CAAC;AAAA,IACxD;AAAA,EACD,SAAS,GAAG;AACX,YAAQ,IAAI,EAAE,OAAO;AAErB,WAAO;AAAA,EACR;AAGA,aAAW,KAAK;AAGhB,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,iBAAiB,CAAC;AAAA,IACrC;AAAA,IACA;AAAA,EACD;AAGA,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,6BAA6B,CAAC;AAAA,IACjD;AAAA,IACA;AAAA,EACD;AAGA,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,6BAA6B,CAAC;AAAA,IACjD;AAAA,IACA;AAAA,EACD;AAEA,MAAW,sBAAsB,MAAM;AACtC,eAAW,OAAO,YAAY,WAAW,CAAC,MAAM;AAC/C,mBAAa,KAAK,6BAA6B,CAAC;AAAA,IACjD;AAAA,EACD;AAGA,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,iBAAiB,CAAC;AAAA,IACrC;AAAA,IACA;AAAA,EACD;AAGA,eAAa,KAAK,YAAY,KAAK,QAAQ;AAE3C,SAAO;AACR;AAUO,SAAS,aAAa,OAAO,QAAQ,wBAAwB,OAAO;AAC1E,MAAI;AAEJ,MAAI,UAAU,KAAK,WAAW,GAAG;AAChC,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,MAAW,oBAAoB,QAAQ,0BAA0B,MAAM;AACtE,cAAU,IAAI,WAAW,gBAAgB,GAAG,CAAC;AAG7C,QAAI,OAAO,QAAQ,UAAU,aAAa;AACzC,cAAQ,QAAQ,CAAC;AAAA,IAClB;AAAA,EACD,OAAO;AAEN,cAAU,WAAW,SAAS,cAAc,QAAQ;AAAA,EACrD;AACA,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AAEjB,SAAO;AACR;AAOO,SAAS,YAAY;AAC3B,SAAO,KAAK,iBAAiB;AAC9B;;;AKhKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,IAAM,KACZ,OAAO,WAAW,cAAc,cAC7B,WAAW,UAAU,YACrB;AACG,IAAM,MAAM,oBAAoB,KAAK,EAAE;AACvC,IAAM,UAAU,WAAW,KAAK,EAAE;AAClC,IAAM,WAAW,aAAa,KAAK,EAAE;AACrC,IAAM,QAAQ,SAAS,KAAK,EAAE;AAC9B,IAAM,WAAW,OAAO,KAAK,EAAE;AAC/B,IAAM,KAAK,iBAAiB,KAAK,EAAE;AACnC,IAAM,aAAa,cAAc,KAAK,EAAE;AACxC,IAAM,SAAS,8BAA8B,KAAK,EAAE;AACpD,IAAM,SAAS,YAAY;AAC3B,IAAM,WAAW,kBAAkB,KAAK,EAAE;AAC1C,IAAM,SACZ,OAAO,WAAW,YAAY,eAC9B,OAAO,WAAW,QAAQ,YAAY,eACtC,WAAW,QAAQ,QAAQ,SAAS;AAC9B,IAAM,WACZ,QAAQ,KAAK,EAAE,KAAK,OAAO,WAAW,MAAM,cAAc,UAAU;AAC9D,IAAM,SACX,OAAO,WAAW,cAAc,eAChC,gBAAgB,WAAW,aAC3B,WAAW,UAAU,eAAe,QACpC,OAAO,WAAW,eAAe,eACjC,WAAW,WAAW,4BAA4B,EAAE;;;ACzCtD,IAAI,aAAa;AAGjB,IAAI,aAAa;AAGjB,SAAS,YAAY;AAEpB,MAAI,CAAC,YAAY;AAEhB,QACC,OAAO,WAAW,aAAa,eAC/B,CAAC,WAAW,SAAS,MACpB;AACD,aAAO,WAAW,WAAW,EAAE;AAAA,IAChC;AAGA,QACC,OAAO,WAAW,aAAa,eAC/B,OAAO,WAAW,SAAS,wBAAwB,YAClD;AACD,iBAAW,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAEA,QAAI,OAAO,WAAW,wBAAwB,YAAY;AAEzD,iBAAW,oBAAoB,QAAQ,WAAW,KAAK;AAAA,IACxD;AAGA,iBAAa,KAAK,SAAS;AAG3B,iBAAa;AAAA,EACd;AACD;AAGO,IAAM,mBAAmB,CAAC,OAAmB;AAEnD,MAAI,YAAY;AAEf,OAAG;AAAA,EACJ,OAAO;AAEN,iBAAa,gBAAgB,WAAW,EAAE;AAE1C,QAAI,CAAC,YAAY;AAEhB,UACC,UACC,OAAO,WAAW,aAAa,eAC/B,WAAW,SAAS,eAAe,YACnC;AAED,mBAAW,WAAW,WAAW,CAAC;AAAA,MACnC,OAAO;AACN,YACC,OAAO,WAAW,aAAa,eAC/B,OAAO,WAAW,SAAS,qBAAqB,YAC/C;AAED,qBAAW,SAAS;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA,mBAAW,iBAAiB,QAAQ,WAAW,KAAK;AAAA,MACrD;AACA,mBAAa;AAAA,IACd;AAAA,EACD;AACD;;;ACnFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAM,aAAa;AAEnB,IAAM,qBAAqB,CAAC,GAAW,MAAc;AACpD,MAAI,MAAM,GAAG;AACZ,WAAO;AAAA,EACR,WAAW,IAAI,GAAG;AACjB,WAAO;AAAA,EACR,OAAO;AACN,WAAO;AAAA,EACR;AACD;AAEA,IAAM,eAAe;AAErB,IAAM,SAAN,MAAa;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAYC,UAAiB;AAC5B,QAAIA,SAAQ,SAAS,YAAY;AAChC,YAAM,IAAI,UAAU,0BAA0B,UAAU,aAAa;AAAA,IACtE;AAEA,UAAM,IAAIA,SAAQ,KAAK,EAAE,MAAM,YAAY;AAE3C,QAAI,CAAC,GAAG;AACP,YAAM,IAAI,UAAU,oBAAoBA,QAAO,EAAE;AAAA,IAClD;AAGA,SAAK,QAAQ,CAAC,EAAE,CAAC;AACjB,SAAK,QAAQ,CAAC,EAAE,CAAC;AACjB,SAAK,QAAQ,CAAC,EAAE,CAAC;AAEjB,QAAI,KAAK,QAAQ,OAAO,oBAAoB,KAAK,QAAQ,GAAG;AAC3D,YAAM,IAAI,UAAU,uBAAuB;AAAA,IAC5C;AAEA,QAAI,KAAK,QAAQ,OAAO,oBAAoB,KAAK,QAAQ,GAAG;AAC3D,YAAM,IAAI,UAAU,uBAAuB;AAAA,IAC5C;AAEA,QAAI,KAAK,QAAQ,OAAO,oBAAoB,KAAK,QAAQ,GAAG;AAC3D,YAAM,IAAI,UAAU,uBAAuB;AAAA,IAC5C;AAAA,EACD;AAAA,EAEA,WAAW;AACV,WAAO,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,QAAQ,OAAe;AACtB,QAAI,MAAM,SAAS,MAAM,KAAK,SAAS,GAAG;AACzC,aAAO;AAAA,IACR;AAEA,WAAO,KAAK,YAAY,KAAK;AAAA,EAC9B;AAAA,EAEA,YAAY,OAAe;AAC1B,WACC,mBAAmB,KAAK,OAAO,MAAM,KAAK,KAC1C,mBAAmB,KAAK,OAAO,MAAM,KAAK,KAC1C,mBAAmB,KAAK,OAAO,MAAM,KAAK;AAAA,EAE5C;AACD;AAEO,IAAM,UAAU,CAAC,GAAW,MAAc;AAChD,SAAO,IAAI,OAAO,CAAC,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC;AAC3C;;;ACvEA;AAAA;AAAA,gBAAAC;AAAA,EAAA;AAAA,wBAAAC;AAAA;AAkBO,SAAS,OAAU,KAAU,KAAa;AAChD,QAAM,IAAI,MAAM,UAAU,QAAQ,KAAK,KAAK,GAAG;AAC/C,MAAI,MAAM,IAAI;AACb,UAAM,UAAU,OAAO,KAAK,KAAK,GAAG,CAAC;AAAA,EACtC;AACA,SAAO;AACR;AAWO,SAASC,QAAU,KAAU;AACnC,SAAO,IAAI,OAAW,GAAG,IAAI,MAAM,CAAC;AACrC;AAOO,SAASC,gBAAkB,KAAU;AAC3C,SAAO,IAAI,eAAmB,GAAG,IAAI,MAAM,CAAC;AAC7C;;;AC9CA;AAAA;AAAA;AAAA;AAAA;AAKA,IAAM,OAAO;AACb,IAAM,MAAM;AAOL,SAAS,YAAY,MAAc;AACzC,SAAO,KAAK,QAAQ,MAAM,EAAE,EAAE,QAAQ,KAAK,EAAE;AAC9C;AAOO,SAAS,aAAa,MAAc;AAC1C,SAAO,KAAK,UAAU,KAAK,YAAY,GAAG,IAAI,GAAG,KAAK,MAAM;AAC7D;;;ACxBA;AAAA;AAAA;AAAA;AAAA;AAgBO,SAAS,MACf,MACA,YACG,MACF;AACD,SAAO,WAAW,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,IAAI;AACjD;AAQO,IAAM,WAAW,CAAC,IAAgB,OAAe,QAAQ;AAC/D,MAAI,YACH,QACA;AACD,SAAO,IAAI,SAA+B;AACzC,QAAI,CAAC,YAAY;AAChB,SAAG,MAAM,QAAM,IAAI;AACnB,iBAAW,KAAK,IAAI;AACpB,mBAAa;AAAA,IACd,OAAO;AACN,mBAAa,MAAM;AACnB,eAAS;AAAA,QACR,MAAM;AACL,cAAI,KAAK,IAAI,IAAI,YAAY,MAAM;AAClC,eAAG,MAAM,QAAM,IAAI;AACnB,uBAAW,KAAK,IAAI;AAAA,UACrB;AAAA,QACD;AAAA,QACA,KAAK,IAAI,QAAQ,KAAK,IAAI,IAAI,WAAW,CAAC;AAAA,MAC3C;AAAA,IACD;AAAA,EACD;AACD;;;AJrCA,IAAI,YAAY;AAChB,IAAI,aAAa;AAcV,SAAS,aAAa,IAAY,IAAY;AAEpD,MAAI,QAAQ,KAAK,EAAE,GAAG;AACrB,UAAM;AAAA,EACP,WAAW,aAAa,KAAK,EAAE,GAAG;AACjC,UAAM;AAAA,EACP;AACA,MAAI,QAAQ,KAAK,EAAE,GAAG;AACrB,UAAM;AAAA,EACP,WAAW,aAAa,KAAK,EAAE,GAAG;AACjC,UAAM;AAAA,EACP;AACA,SAAO,QAAQ,IAAI,EAAE;AACtB;AAiBO,SAAS,eAAe,KAAa;AAC3C,QAAM,OAAyC,CAAC;AAEhD,MAAI,OAAO,QAAQ,aAAa;AAC/B,QAAI,OAAO,WAAW,aAAa,aAAa;AAC/C,YAAM,WAAW,WAAW,SAAS;AAErC,UAAI,YAAY,SAAS,MAAM;AAC9B,cAAM,SAAS;AAAA,MAChB,OAAO;AAEN,eAAO;AAAA,MACR;AAAA,IACD,OAAO;AAEN,aAAO;AAAA,IACR;AAAA,EACD,OAAO;AAEN,UAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,QAAI,UAAU,IAAI;AACjB,YAAM,IAAI,MAAM,OAAO,IAAI,MAAM;AAAA,IAClC,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MACE,MAAM,CAAC,EACP,MAAM,GAAG,EACT,OAAO,CAAC,UAAU;AAClB,WAAO,UAAU;AAAA,EAClB,CAAC,EACA,QAAQ,CAAC,UAAU;AACnB,UAAM,KAAK,MAAM,MAAM,GAAG;AAC1B,UAAM,IAAI,GAAG,MAAM;AACnB,UAAM,IAAI,GAAG,KAAK,GAAG;AACrB,SAAK,CAAC,IAAI,KAAK;AAAA,EAChB,CAAC;AAEF,SAAO;AACR;AAQO,SAAS,UAAU,MAAc,QAAQ,GAAG;AAElD,cAAY,MAAM,KAAK,YAAY,CAAC;AACpC,eAAa;AACd;AAOO,SAAS,WAAW,QAAQ,GAAG;AAErC,gBAAc;AACd,SAAO,GAAG,SAAS,IAAI,SAAS,UAAU;AAC3C;AAEO,IAAM,gBAAgB,CAAC,UAAsC;AACnE,SACC,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,YAAY;AACxB,WAAO,OAAO,YAAY;AAAA,EAC3B,CAAC;AAEH;;;AKlGA,IAAM,OAAgC,CAAC;AAEvC,IAAI,kBAAkB;AAEtB,IAAI;AAEH,oBACC,OAAO,eAAe,eACtB,OAAO,WAAW,iBAAiB;AACrC,QAAQ;AAEP,oBAAkB;AACnB;AAMA,SAAS,WAAW,KAAa;AAChC,SAAO,QAAQ,SAAS,QAAQ;AACjC;AAGA,aAAa,gBAAgB,MAAM,MAAM;AAExC,MAAI,iBAAiB;AACpB,UAAM,kBAAkB,aAAa,QAAQ,SAAS;AAEtD,QAAI,oBAAoB,QAAQ,gBAAgB,SAAS,GAAG;AAC3D,UAAI;AACH,cAAM,SAAkB,KAAK,MAAM,eAAe;AAClD,cAAM,OAAO,cAAc,MAAM,IAAI,SAAS,CAAC;AAC/C,mBAAW,OAAO,MAAM;AACvB,cAAI;AACH,kBAAM,aAAa,WAAW,GAAG;AACjC,kBAAMC,UAAS,aAAa,QAAQ,UAAU;AAC9C,iBAAK,GAAG,IAAIA,YAAW,OAAO,OAAO,KAAK,MAAMA,OAAM;AAAA,UACvD,QAAQ;AAAA,UAER;AAAA,QACD;AAAA,MACD,QAAQ;AAAA,MAER;AAAA,IACD;AAAA,EACD;AACD,CAAC;AAED,IAAM,OAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUrC,IAAI,OAAoC;AACvC,UAAM,MAAM;AAEZ,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACrC,UAAI,WAAW,GAAG,GAAG;AACpB;AAAA,MACD;AAEA,aAAO,eAAe,KAAK,KAAK;AAAA,QAC/B,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,MAAM;AACL,iBAAO,KAAK,GAAG;AAAA,QAChB;AAAA,QACA,IAAI,OAAO;AACV,eAAK,GAAG,IAAI;AACZ,cAAI,iBAAiB;AACpB,yBAAa,QAAQ,WAAW,GAAG,IAAI,KAAK,UAAU,KAAK,CAAC;AAAA,UAC7D;AAAA,QACD;AAAA,MACD,CAAC;AAED,UAAI,EAAE,OAAO,OAAO;AACnB,aAAK,GAAG,IAAI,MAAM,GAAG;AAAA,MACtB;AAAA,IACD;AAGA,QAAI,iBAAiB;AACpB,mBAAa,QAAQ,WAAW,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,IAClE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAa;AACnB,QAAI,CAAC,WAAW,GAAG,GAAG;AACrB,UAAI,OAAO,KAAK,GAAG,MAAM,aAAa;AACrC,eAAO,KAAK,GAAG;AACf,YAAI,iBAAiB;AACpB,qBAAW,aAAa,WAAW,WAAW,GAAG,EAAE;AACnD,qBAAW,aAAa;AAAA,YACvB;AAAA,YACA,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC;AAAA,UACjC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAEA,IAAO,eAAQ;;;Af1If,IAAI,mBAAmB;AACvB,IAAI,+BAA+B;AAEnC,IAAI,eAAe;AAEnB,IAAM,UAAU;AAAA,EACf,MAAM;AAAA,EACN,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACT;AAGA,IAAI;AAGJ,IAAI,eAAe;AAEnB,SAAS,eAAe,GAAG;AAC1B,IAAE,eAAe;AACjB,MAAI,OAAO,WAAW,WAAW,YAAY;AAC5C,eAAW,OAAO,GAAG,CAAC;AAAA,EACvB;AACA,SAAO;AACR;AAEA,SAASC,mBAAkB;AAC1B,MAAI;AACH,WAAO,CAAC,CAAC,WAAW;AAAA,EACrB,QAAQ;AAEP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,qBAAqB;AAC7B,MAAI;AAGH,WACC,OAAO,WAAW,oBAAoB,eACtC,IAAI,WAAW,gBAAgB,GAAG,CAAC,EAAE,WAAW,IAAI,MAAM;AAAA,EAE5D,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAMA,SAAS,eAAe,GAAG;AAE1B,kBAAgB,EAAE,6BAA6B;AAC/C,kBAAgB,EAAE,6BAA6B;AAC/C,kBAAgB,EAAE,6BAA6B;AAChD;AAMO,SAAS,eAAe,GAAG;AACjC,UAAQ,EAAE;AACV,SAAO,EAAE;AACT,UAAQ,EAAE;AACX;AAQO,IAAM,WAAW;AAQjB,IAAM,aAAa,CAAC,EAAE,kBAAkB;AAQxC,IAAM,eAAe,CAAC,CAAC,WAAW;AAQlC,IAAM,QACZ,cAAe,gBAAgB,WAAW,UAAU,iBAAiB;AAY/D,IAAM,iBAAiB,QAC3B,eACC,WAAW,UAAU,kBAAkB,IACvC,KACD;AAQI,IAAM,QACZ,OAAO,WAAW,aAAa,eAC/B,aAAa,WAAW,SAAS,cAAc,KAAK;AAQ9C,IAAM,wBACZ,OAAO,WAAW,aAAa,eAC/B,OAAO,WAAW,SAAS,uBAAuB;AAQ5C,IAAM,uBAAuB,CAAC,CAAC,WAAW;AAS1C,IAAM,oBACZ,OAAO,WAAW,eAAe,OAAO,OAAO,gBAAgB;AAQzD,IAAM,mBAAmB,CAAC,CAAC,WAAW;AAQtC,IAAM,uBACZ,OAAO,WAAW,aAAa,gBAC9B,SAAS,qBAAqB,WAAW,QAAQ,KACjD,WAAW,SAAS;AAQf,IAAM,cAAc,CAAC,EAC3B,WAAW,gBAAgB,WAAW;AAShC,IAAM,gBAAgB,OAAO,WAAW,UAAU;AAQlD,IAAM,QAAQ,eAAe;AAQ7B,IAAM,WACZ,OAAO,WAAW,aAAa,eAC/B,CAAC,CAAC,WAAW,SAAS,cAAc,OAAO,EAAE;AASvC,IAAMC,gBAAeD,iBAAgB;AAQrC,IAAM,kBAAkB,mBAAmB;AAQ3C,IAAM,eAAe,OAAO,WAAW,SAAS;AAUhD,IAAM,WACZ,OAAO,WAAW,cAAc,cAC7B,WAAW,UAAU,YACtB,WAAW,UAAU,mBACrB,WAAW,UAAU,gBACrB,OACC;AAQG,IAAM,mBAAmB,WAAW,oBAAoB;AASxD,IAAME,YAAW,SAAS;AAS1B,IAAI,gBAAgB;AASpB,IAAI,gBAAgB;AASpB,IAAI,gBAAgB;AASpB,IAAI,QAAQ;AASZ,IAAI,OAAO;AAUX,IAAI,QAAQ;AAQZ,IAAI,YAAY;AA6ChB,SAAS,QAAQ,IAAI;AAE3B,MAAI,OAAO,WAAW,qBAAqB,YAAY;AAEtD,eAAW;AAAA,MACV;AAAA,MACA,MAAM;AACL,qBAAa,KAAK,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,IACD;AAEA,eAAW;AAAA,MACV;AAAA,MACA,MAAM;AACL,qBAAa,KAAK,KAAK;AAEvB,YAAI,cAAc,MAAM;AACvB,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACA,MAAI,OAAO,WAAW,aAAa,aAAa;AAC/C,QAAI,OAAO,WAAW,SAAS,qBAAqB,YAAY;AAE/D,iBAAW,SAAS;AAAA,QACnB;AAAA,QACA,MAAM;AACL,cAAI,WAAW,SAAS,oBAAoB,WAAW;AACtD,yBAAa,KAAK,KAAK;AAEvB,gBAAI,cAAc,MAAM;AACvB,oBAAM;AAAA,YACP;AAAA,UACD,OAAO;AACN,yBAAa,KAAK,IAAI;AAAA,UACvB;AAAA,QACD;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,mBAAiB,EAAE;AACpB;AAOO,SAAS,YAAYC,SAAQ;AACnC,QAAM,YAAY,eACf,gBACA,aACC,cACA;AACJ,MAAIA,YAAW,OAAO;AACrB,QAAI,iBAAiB,OAAO;AAC3B,iBAAW,SAAS,oBAAoB,WAAW,cAAc;AACjE,qBAAe;AAAA,IAChB;AAAA,EACD,WAAW,iBAAiB,MAAM;AACjC,eAAW,SAAS,iBAAiB,WAAW,gBAAgB;AAAA,MAC/D,SAAS;AAAA,IACV,CAAC;AACD,mBAAe;AAAA,EAChB;AACD;AAOO,SAAS,eAAe;AAC9B,MAAI,sBAAsB;AACzB,WAAO,CAAC,EACP,SAAS,qBAAqB,WAAW,QAAQ,KACjD,WAAW,SAAS;AAAA,EAEtB,OAAO;AACN,WAAO;AAAA,EACR;AACD;AAkBO,SAAS,kBAAkB,SAAS;AAC1C,MAAI,wBAAwB,CAAC,aAAa,GAAG;AAC5C,cAAU,WAAW,UAAU;AAC/B,YAAQ,oBACP,SAAS,qBAAqB,OAAO,KAAK,QAAQ;AACnD,YAAQ,kBAAkB;AAAA,EAC3B;AACD;AAMO,IAAM,iBAAiB,MAAM;AACnC,MAAI,wBAAwB,aAAa,GAAG;AAC3C,aAAS,eAAe;AAAA,EACzB;AACD;AASO,SAAS,uBAAuB;AACtC,QAAM,WAAW;AACjB,QAAM,YAAY;AAElB,QAAMC,UAAS,WAAW;AAG1B,MAAI,sBAAsB,MAAM;AAC/B,UAAMC,eAAc,SAAS,eAAeD,OAAM;AAClD,QACC,OAAOC,iBAAgB,eACvB,OAAOA,aAAY,SAAS,UAC3B;AAED,aAAOA,aAAY;AAAA,IACpB,WAAW,OAAOA,iBAAgB,UAAU;AAE3C,aAAOA;AAAA,IACR;AAAA,EACD;AAGA,MAAI,OAAO,WAAW,gBAAgB,UAAU;AAC/C,WAAO,KAAK,IAAI,WAAW,WAAW,MAAM,KAAK,YAAY;AAAA,EAC9D;AAGA,SAAO,WAAW,aAAa,WAAW,cAAc,YAAY;AACrE;AAUO,SAAS,gBAAgBA,cAAa;AAC5C,QAAMD,UAAS,WAAW;AAC1B,MAAI,OAAOA,YAAW,aAAa;AAClC,UAAM,mBAAmB,SAAS,mBAAmBA,OAAM;AAC3D,QAAI,OAAO,qBAAqB,aAAa;AAC5C,aAAO,iBAAiBC,YAAW;AAAA,IACpC;AAAA,EACD;AACA,SAAO;AACR;AASO,SAAS,oBAAoB;AACnC,QAAMD,UAAS,WAAW;AAC1B,MAAI,OAAOA,YAAW,aAAa;AAClC,UAAM,qBAAqB,SAAS,qBAAqBA,OAAM;AAC/D,QAAI,OAAO,uBAAuB,aAAa;AAC9C,aAAO,mBAAmB;AAAA,IAC3B;AAAA,EACD;AACA,SAAO;AACR;AAOO,SAAS,aAAa;AAC5B,SAAO,qBAAqB,EAAE,SAAS,UAAU;AAClD;AAOO,SAAS,cAAc;AAC7B,SAAO,qBAAqB,EAAE,SAAS,WAAW;AACnD;AASO,SAAS,WAAW,OAAO,SAAS;AAC1C,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,IAER;AACC,YAAM,IAAI,MAAM,kBAAkB,OAAO,gBAAgB;AAAA,EAC3D;AACD;AAQO,SAAS,iBAAiB,SAAS;AACzC,MAAI,SAAS,WAAW,OAAO;AAE/B,MAAI,OAAO,eAAe,MAAM;AAC/B,aAAS,OAAO;AAAA,EACjB;AAEA,SAAO;AACR;AAQO,SAAS,WAAW,SAAS;AACnC,MAAI,SAAS;AAEb,MAAI,YAAY,aAAa;AAC5B,QAAI,OAAO,YAAY,UAAU;AAChC,eAAS,WAAW,SAAS,eAAe,OAAO;AAAA,IACpD,WACC,OAAO,YAAY,YACnB,QAAQ,aAAa,KAAK,cACzB;AACD,eAAS;AAAA,IACV;AAAA,EACD;AAGA,MAAI,CAAC,QAAQ;AAEZ,aAAS,WAAW,SAAS;AAAA,EAC9B;AAEA,SAAO;AACR;AAUO,SAAS,iBAAiB,SAAS;AACzC,MACC,OAAO,YAAY,YACnB,YAAY,WAAW,SAAS,QAChC,OAAO,QAAQ,0BAA0B,aACxC;AACD,WAAO,QAAQ,sBAAsB;AAAA,EACtC,OAAO;AACN,YAAQ,QAAQ,QAAQ,QAAQ,WAAW;AAC3C,YAAQ,SAAS,QAAQ,SAAS,WAAW;AAC7C,WAAO;AAAA,EACR;AACD;AAUO,SAAS,gBAAgB,SAAS;AACxC,SAAO,iBAAiB,iBAAiB,OAAO,CAAC;AAClD;AASO,SAAS,iBAAiB,SAAS;AACzC,MAAI,iBAAiB,IAAI;AACxB,QAAI,aAAa;AACjB,QAAI;AACH,YAAM,SAAS,WAAW,SAAS,cAAc,QAAQ;AACzD,YAAM,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,8BAA8B,QAAQ;AAAA,MACvC;AACA,mBAAa,CAAC,EACb,WAAW,0BACV,OAAO,WAAW,SAAS,UAAU,KACrC,OAAO,WAAW,sBAAsB,UAAU;AAEpD,qBAAe,aAAa,IAAI;AAAA,IACjC,QAAQ;AACP,qBAAe;AAAA,IAChB;AAAA,EACD;AACA,SAAO,iBAAiB;AACzB;AAUO,SAAS,QAAQ;AACvB,MAAI,OAAO,WAAW,UAAU,YAAY;AAC3C,eAAW,MAAM;AAAA,EAClB;AACD;AAuBO,SAAS,qBAAqB;AACpC,MAAI,oBAAoB,CAAC,kBAAkB;AAC1C,QACC,0BACA,OAAO,uBAAuB,sBAAsB,YACnD;AACD,6BAAuB,kBAAkB,EACvC,KAAK,CAAC,aAAa;AACnB,YAAI,aAAa,WAAW;AAE3B,qBAAW,iBAAiB,gBAAgB,gBAAgB,KAAK;AACjE,6BAAmB;AAAA,QACpB;AAAA,MACD,CAAC,EACA,MAAM,QAAQ,KAAK;AAAA,IACtB,OAAO;AAEN,iBAAW,iBAAiB,gBAAgB,gBAAgB,KAAK;AACjE,yBAAmB;AAAA,IACpB;AAAA,EACD;AACA,SAAO;AACR;AAMO,SAAS,uBAAuB;AACtC,MAAI,kBAAkB;AAErB,eAAW,oBAAoB,gBAAgB,gBAAgB,KAAK;AACpE,uBAAmB;AAAA,EACpB;AACD;AAqBO,SAAS,yBAAyB;AACxC,MAAI,wBAAwB,CAAC,8BAA8B;AAC1D,QAAI,OAAO,uBAAuB,sBAAsB,YAAY;AACnE,6BAAuB,kBAAkB,EACvC,KAAK,CAAC,aAAa;AACnB,YAAI,aAAa,WAAW;AAC3B,qBAAW;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACD;AACA,yCAA+B;AAAA,QAChC;AAAA,MACD,CAAC,EACA,MAAM,QAAQ,KAAK;AAAA,IACtB,OAAO;AACN,iBAAW,iBAAiB,qBAAqB,gBAAgB,KAAK;AACtE,qCAA+B;AAAA,IAChC;AAAA,EACD;AACA,SAAO;AACR;AAMO,SAAS,2BAA2B;AAC1C,MAAI,8BAA8B;AACjC,eAAW,oBAAoB,qBAAqB,gBAAgB,KAAK;AACzE,mCAA+B;AAAA,EAChC;AACD;AAmBO,SAAS,QAAQ,SAAS;AAChC,MACC,OAAO,WAAW,cAAc,eAChC,OAAO,WAAW,UAAU,YAAY,YACvC;AACD,eAAW,UAAU,QAAQ,OAAO;AAAA,EACrC;AACD;AAQO,SAAS,eAAe,OAAO;AACrC,MAAI,SAAS;AACb,MAAI,aAAa,MAAM;AACtB,QAAI,OAAO,gBAAgB,aAAa;AAEvC,YAAM,eAAe,WAAW,SAAS,cAAc,OAAO;AAC9D,oBAAc;AAAA,QACb,MAAM,aACJ,YAAY,iCAAiC,EAC7C,QAAQ,QAAQ,EAAE;AAAA,QACpB,MAAM,aACJ,YAAY,0BAA0B,EACtC,QAAQ,QAAQ,EAAE;AAAA,QACpB,KAAK,aACH,YAAY,4BAA4B,EACxC,QAAQ,QAAQ,EAAE;AAAA,QACpB,KAAK,aACH,YAAY,iCAAiC,EAC7C,QAAQ,QAAQ,EAAE;AAAA,QACpB,KAAK,aAAa,YAAY,aAAa,EAAE,QAAQ,QAAQ,EAAE;AAAA,QAC/D,MAAM,aACJ,YAAY,kCAAkC,EAC9C,QAAQ,QAAQ,EAAE;AAAA,QACpB,KAAK,aACH,YAAY,0BAA0B,EACtC,QAAQ,QAAQ,EAAE;AAAA,QACpB,KAAK,aACH,YAAY,6CAA6C,EACzD,QAAQ,QAAQ,EAAE;AAAA,MACrB;AAAA,IACD;AACA,aAAS,CAAC,CAAC,YAAY,KAAK;AAAA,EAC7B;AACA,SAAO;AACR;;;AgBz5BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAAE;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA6B;AAa7B,IAAM,cAAc,CAAC;AAMrB,IAAI,mBAAmB;AAMvB,IAAI,gBAAgB;AAMpB,IAAI,YAAY,CAAC;AAMjB,IAAM,iBAAiB,SAAU,YAAY,YAAY;AAExD,MAAI,kBAAkB,GAAG;AAExB,UAAM,SAAS,6BAA6B;AAC5C,QAAI,qBAAqB,OAAO;AAE/B,cAAQ;AAER,mBAAa;AAEb,cAAQ,IAAI,SAAS,mBAAmB;AAAA,IACzC,OAAO;AACN,mBAAa;AAEb,YAAM,IAAI,MAAM,MAAM;AAAA,IACvB;AAAA,EAED,OAAO;AACN,gBAAY,UAAU,EAAE,KAAK;AAAA,EAC9B;AACD;AASO,IAAI,mBAAmB;AAkBvB,SAASC,MAAK,SAAS,OAAO;AAEpC,cAAY,OAAO,MAAM,GAAG;AAE5B,SAAO,CAAC,qBAAO;AAChB;AAOO,SAAS,UAAU,OAAO;AAChC,SAAO,SAAS,KAAK,qBAAO,OAAO,KAAK;AACzC;AAMO,SAAS,WAAW;AAC1B,SAAO,CAAC,qBAAO;AAChB;AAOO,SAAS,SAAS;AACxB,YAAU;AACX;AAKO,SAAS,UAAU;AACzB,UAAQ;AACT;AAUO,SAAS,KAAKC,QAAO,UAAU,WAAW,WAAW,CAAC,GAAG;AAC/D,QAAM,OAAO,CAAC;AACd,MAAI,UAAU,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,MAAI,UAAUA,OAAM,GAAG,MAAM,MAAM;AAClC,SAAK,KAAKA,OAAM,GAAG;AAAA,EACpB,OAAO;AACN,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,WAAK,KAAKA,OAAM,MAAMA,OAAM,OAAO,MAAM,UAAU,CAAC,IAAI,SAAS,OAAO;AAAA,IACzE;AAAA,EACD;AAEA,cAAYA,OAAM,IAAI,IAAI,IAAI,mBAAK;AAAA,IAClC,KAAK;AAAA,IACL,QAAQ,qBAAO,OAAO;AAAA,IACtB,UAAUA,OAAM,aAAa;AAAA,IAC7B,MAAOA,OAAM,OAAO;AAAA,IACpB,OAAOA,OAAM,WAAW,QAAQA,OAAM,UAAU;AAAA,IAChD,oBAAoB,SAAS;AAAA,IAC7B,cAAc;AACb,qBAAe,KAAK,MAAMA,OAAM,MAAM,SAAS;AAAA,IAChD;AAAA,IACA,SAAS;AACR,sBAAgB;AAChB,UAAI,OAAO,aAAa,YAAY;AACnC,iBAAS;AAAA,MACV;AAAA,IACD;AAAA,EACD,CAAC;AAED,SAAO;AACR;AAmBO,SAAS,KAAK,YAAY,OAAO,OAAO,OAAO,QAAQ;AAC7D,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,UAAM,KAAKA,OAAM,KAAK;AACtB,QAAI,OAAO,SAAS,WAAW;AAE9B,MAAAA,OAAM,KAAK,MAAM,EAAE;AAAA,IACpB;AACA,IAAAA,OAAM;AAAA,MACL,OAAO,WAAW,WAAW,MAAM,QAAQ,GAAK,CAAG,IAAI,qBAAO,OAAO;AAAA,MACrE;AAAA,IACD;AACA,QAAI,OAAO,UAAU,YAAY;AAChC,UAAI,SAAS,MAAM;AAClB,QAAAA,OAAM,GAAG,OAAO,OAAO,EAAE;AAAA,MAC1B,OAAO;AACN,QAAAA,OAAM,KAAK,OAAO,OAAO,EAAE;AAAA,MAC5B;AAAA,IACD;AACA,WAAO;AAAA,EACR,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAUO,SAAS,KAAK,YAAY,MAAM,IAAI,UAAU,IAAI;AACxD,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,IAAAA,OAAM,KAAK,MAAM,IAAI,UAAU,EAAE;AAAA,EAClC,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAcO,SAAS,KAAK,eAAe,MAAM;AACzC,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,KAAK,GAAG,IAAI;AAAA,EAC1B,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAcO,SAAS,KAAK,eAAe,MAAM;AACzC,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,KAAK,GAAG,IAAI;AAAA,EAC1B,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAWO,SAAS,OAAO,YAAY,KAAK,IAAI;AAC3C,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,OAAO,KAAK,EAAE;AAAA,EAC5B,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAWO,SAAS,SAAS,YAAY,GAAG,GAAG,GAAG,IAAI;AACjD,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,EAC7B,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAYO,SAAS,YAAY,YAAY,GAAG,GAAG,GAAG,IAAI;AACpD,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,YAAY,GAAG,GAAG,GAAG,EAAE;AAAA,EACrC,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAyBO,SAAS,OAAO,YAAY,YAAY,IAAI;AAClD,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,WAAOA,OAAM,WAAW,YAAY,EAAE;AAAA,EACvC,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AASO,SAAS,KAAK,YAAY,IAAI;AACpC,MAAI,OAAO,eAAe,aAAa;AACtC,UAAMA,SAAQ,YAAY,UAAU;AACpC,QAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,MAAAA,OAAM,KAAK,EAAE;AAEb,MAAAA,OAAM,IAAI,OAAO,QAAW,EAAE;AAAA,IAC/B,OAAO;AACN,YAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,IAC/D;AAAA,EACD,OAAO;AACN,yBAAO,KAAK;AAAA,EACb;AACD;AAUO,SAAS,MAAM,YAAY,IAAI;AACrC,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,IAAAA,OAAM,MAAM,EAAE;AAAA,EACf,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAgBO,SAAS,OAAO,YAAY,IAAI;AACtC,QAAMA,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,IAAAA,OAAM,KAAK,EAAE;AAAA,EACd,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAYO,SAAS,UAAU,YAAY,QAAQ;AAC7C,qBAAmB;AACnB,SAAO,KAAK,kBAAkB,MAAM,MAAM,MAAM;AACjD;AAWO,SAAS,YAAY;AAC3B,MAAI,qBAAqB,MAAM;AAC9B,gBAAY,gBAAgB,EAAE,KAAK;AACnC,uBAAmB;AAAA,EACpB;AACD;AAOO,SAAS,aAAa;AAC5B,MAAI,qBAAqB,MAAM;AAC9B,gBAAY,gBAAgB,EAAE,MAAM;AAAA,EACrC;AACD;AAYO,SAAS,cAAc;AAC7B,MAAI,qBAAqB,MAAM;AAC9B,gBAAY,gBAAgB,EAAE,KAAK;AAAA,EACpC;AACD;AAMO,SAAS,kBAAkB;AACjC,SAAO;AACR;AAMO,SAAS,UAAU,QAAQ;AACjC,uBAAO,OAAO,MAAM;AACrB;AAMO,SAAS,YAAY;AAC3B,SAAO,qBAAO,OAAO;AACtB;AAWO,SAAS,KAAK,YAAY,IAAIC,QAAO,MAAM;AACjD,QAAMD,SAAQ,YAAY,UAAU;AACpC,MAAIA,UAAS,OAAOA,WAAU,aAAa;AAC1C,IAAAA,OAAM,KAAKC,OAAM,EAAE;AAAA,EACpB,OAAO;AACN,UAAM,IAAI,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EAC/D;AACD;AAOO,SAAS,OAAO,YAAY,IAAI;AACtC,OAAK,YAAY,IAAI,KAAK;AAC3B;AAKO,SAAS,UAAU;AACzB,uBAAO,KAAK,IAAI;AACjB;AAKO,SAAS,YAAY;AAC3B,uBAAO,KAAK,KAAK;AAClB;AAMO,SAAS,QAAQ;AACvB,SAAO,qBAAO;AACf;AASO,SAAS,OAAO,YAAY;AAClC,MAAI,EAAE,cAAc,cAAc;AACjC,WAAO;AAAA,EACR;AAGA,cAAY,UAAU,EAAE,OAAO;AAC/B,SAAO,YAAY,UAAU;AAC7B,SAAO;AACR;AAOO,SAAS,YAAY;AAC3B,aAAW,cAAc,aAAa;AACrC,QAAI,YAAY,eAAe,UAAU,GAAG;AAC3C,aAAO,UAAU;AAAA,IAClB;AAAA,EACD;AACD;;;AC5jBO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,kBAA2B;AAAA,EAEnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,IAAY,GAAG,IAAY,GAAG,UAAuB;AAChE,UAAM,EAAE,OAAO,OAAO,IAAI,MAAM,UAAU,IAAI,MAAM,GAAG,CAAC,GAAG;AAAA,MAC1D,KAAK,CAAC,QAAQ,UAAU,UAAU;AACjC,YAAI,aAAa,OAAO,aAAa,KAAK;AACzC,kBAAQ,IAAI,QAAQ,UAAU,KAAK;AACnC,cAAI,KAAK,iBAAiB;AACzB,iBAAK,YAAY;AAAA,UAClB;AACA,iBAAO;AAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAED,SAAK,kBAAkB;AACvB,SAAK,UAAU;AACf,SAAK,SAAS;AAEd,QAAI,UAAU;AACb,WAAK,YAAY,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAI,GAAG,IAAI,GAAG;AACjB,SAAK,kBAAkB;AACvB,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAChB,SAAK,YAAY;AACjB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,IAAI,GAAG,IAAI,GAAG;AACtB,SAAK,kBAAkB;AACvB,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAChB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,OAAO,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,OAAO,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAsB;AACjC,SAAK,YAAY;AAAA,EAClB;AAAA,EAUA,OAAO,UAAoC,GAAY;AACtD,WAAO,KAAK,OAAO,OAAO,UAAiB,CAAQ;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,IAAI,iBAAgB,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,SAAS;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACR,SAAK,QAAQ;AAAA,EACd;AACD;;;AC3IA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,aAAqC,CAAC;AAG5C,IAAM,WAAoC,CAAC;AAG3C,IAAM,aAAsC,CAAC;AAG7C,IAAM,WAAoD,CAAC;AAG3D,IAAM,yBAAkD,CAAC;AAGzD,IAAM,eAAuC,CAAC;AAQ9C,IAAM,eAAgC,CAAC,YAAY;AAElD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,SAAS,aAAa,OAAO;AAEnC,eAAa;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,WAAW,MAAM,IAAI;AAAA,EAChC;AAEA,MAAI,QAAQ;AACX,QAAI,CAAC,WAAW,MAAM,GAAG;AACxB,YAAM,WACJ,iBAAiB,UAAU,QAAQ,cAAc,WAAc;AACjE,UAAI,CAAC,SAAS,MAAM,EAAE,OAAO,GAAG;AAC/B,mBAAW,MAAM;AACjB,iBAAS,MAAM,EAAE,OAAO,IAAI;AAAA,MAC7B;AAAA,IACD;AACA,QAAI,oBAAoB,WAAW,uBAAuB,OAAO,GAAG;AACnE,cAAQ,eAAe;AAAA,IACxB;AAAA,EACD;AACD;AAEA,IAAM,aAA8B,CAAC,YAAY;AAEhD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,SAAS,aAAa,OAAO;AAEnC,eAAa,KAAK,OAAO,QAAQ,OAAO;AAExC,MAAI,QAAQ;AACX,UAAM,WACJ,iBAAiB,UAAU,QAAQ,cAAc,WAAc;AACjE,WAAO,SAAS,MAAM,EAAE,OAAO;AAE/B,QAAI,WAAW,MAAM,IAAI,GAAG;AAC3B,iBAAW,MAAM;AAAA,IAClB;AAEA,eAAW,MAAM,IAAI;AAErB,QAAI,oBAAoB,WAAW,uBAAuB,OAAO,GAAG;AACnE,cAAQ,eAAe;AAAA,IACxB;AAAA,EACD;AACD;AASO,IAAM,sBAAsB;AAE5B,SAAS,oBAAoB;AACnC,MAAI,CAAC,UAAU;AACd,QAAI,WAAW,kBAAkB;AAChC,iBAAW;AAAA,QACV;AAAA,QACA,CAAC,MAAM;AACN,uBAAa,CAAC;AAAA,QACf;AAAA,QACA;AAAA,MACD;AACA,iBAAW,iBAAiB,SAAS,YAAY,KAAK;AAAA,IACvD;AAAA,EACD;AACD;AAcO,SAAS,aAAa,QAAgB;AAC5C,MAAI,WAAW,MAAM,KAAK,CAAC,WAAW,MAAM,GAAG;AAC9C,QAAI,SAAS,MAAM,GAAG;AACrB,iBAAW,MAAM,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAOO,SAAS,UAAU,QAAgB;AACzC,SAAO,WAAW,MAAM,IAAI;AAC7B;AAWO,SAAS,gBACf,SACA,QACA,aACC;AACD,QAAM,UAAU,SAAS,eAAe;AACxC,UAAQ,EAAE,SAAS,YAAY,CAAC;AACjC;AAeO,IAAM,UAAU,CACtB,SACA,QACA,MACAC,kBAAiB,mBACb;AACJ,eAAa,OAAO,IAAI;AACxB,yBAAuB,OAAO,IAAIA;AAElC,aAAW,MAAM,IAAI;AACrB,WAAS,MAAM,IAAI,OAAO,OAAO;AACjC,aAAW,MAAM,IAAI;AACrB,WAAS,MAAM,IAAI,CAAC;AACrB;AAOO,SAAS,cAAc,SAAiB;AAC9C,SAAO,aAAa,OAAO;AAC5B;AAWO,SAAS,UAAU,QAAgB;AACzC,aAAW,MAAM,IAAI;AACtB;AAQO,SAAS,UAAU,SAAiB;AAE1C,QAAM,aAAa,aAAa,OAAO;AACvC,aAAW,UAAU,IAAI;AACzB,WAAS,UAAU,IAAI;AACvB,WAAS,UAAU,IAAI,CAAC;AAExB,SAAO,aAAa,OAAO;AAC3B,SAAO,uBAAuB,OAAO;AACtC;;;AC/MA,IAAI,WAAW;AAMf,SAAS,wBAAwB,OAAO,MAAM,QAAQ;AACrD,MACC,WAAW,KAAK,QAAQ,QAAQ,MAChC,WAAW,KAAK,QAAQ,QAAQ,IAC/B;AACD,YAAQ,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO;AACR;AAMA,SAAS,gBAAgB,OAAO,MAAM,QAAQ;AAC7C,MAAI,QAAQ,GAAG;AACd,QAAI,WAAW,KAAK,QAAQ,QAAQ,IAAI;AAGvC,cAAQ,KAAK,IAAI,GAAG,QAAQ,GAAK,IAAI;AAAA,IACtC,OAAO;AAEN,eAAS,QAAQ,KAAK;AAAA,IACvB;AAAA,EACD,OAAO;AAEN,aAAS,QAAQ,SAAS,SAAS;AAAA,EACpC;AAEA,SAAO;AACR;AAGA,IAAM,kBAAkB;AAGxB,IAAM,gBAAgB;AAUtB,SAAS,WAAW,IAAI,SAAS;AAChC,QAAM,cAAc,GAAG,QAAQ,iBAAiB,CAAC,GAAG,GAAG,MAAM;AAC5D,WACC,MAAM,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,MAAM,MAAM,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI;AAAA,EAExE,CAAC;AACD,QAAM,YAAY,GAAG,QAAQ,iBAAiB,CAAC,GAAG,GAAG,MAAM;AAC1D,WACC,EAAE,QAAQ,eAAe,EAAE,IAAI,MAAM,EAAE,QAAQ,eAAe,EAAE,IAAI;AAAA,EAEtE,CAAC;AAGD,UAAQ,SACP,QAAQ,UACR,QAAQ,QAAQ,IAAI,MAAM;AACzB,WAAO;AAAA,EACR,CAAC;AACF,UAAQ,eACP,QAAQ,gBACR,SAAU,OAAO;AAChB,WAAO;AAAA,EACR;AAED,QAAM,IAAI,aAAa,OAAO;AAC9B,QAAM,IAAI,WAAW,OAAO;AAC7B;AAGA,IAAM,WAAW,CAAC;AAGlB,IAAM,QAAQ,oBAAI,IAAI;AAGtB;AAAA;AAAA,EAEC;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACjB,SAAS,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAClE,QAAQ;AAAA,QACP;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,MAC/D;AAAA,MACA,cAAc;AAAA,IACf;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACjB,SAAS,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IACnE;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA;AAAA,IACA;AAAA,MACC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACjB,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,IACvE;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACjB,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,MACrE,QAAQ;AAAA,QACP;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,MAChE;AAAA,MACA,cAAc;AAAA,IACf;AAAA,EACD;AAAA;AAAA,EAGA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACjB,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE;AAAA,MAClE,QAAQ;AAAA,QACP;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,MAC/D;AAAA,MACA,cAAc;AAAA,IACf;AAAA,EACD;AACD,EAAE,QAAQ,CAAC,UAAU;AACpB,aAAW,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9B,CAAC;AAMD,IAAM,iBAAiB,WAAY;AAClC,QAAM,WAAW,UAAU,YAAY;AAGvC,SAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,UAAU;AACxC,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,CAAC,SAAS;AACb;AAAA,IACD;AAEA,QAAI,UAAU;AACd,QAAI,QAAQ,YAAY,YAAY;AACnC,gBAAU,MAAM,IAAI,QAAQ,EAAE;AAAA,IAC/B;AAEA,UAAM,UAAU,SAAS,KAAK;AAG9B,WAAO,KAAK,QAAQ,OAAO,EAAE,QAAQ,CAAC,WAAW;AAChD,YAAM,OAAO,QAAQ,QAAQ,MAAM;AACnC,UAAI,gBAAgB;AACpB,UAAI,cAAc;AAGlB,UAAI,SAAS;AACZ,wBAAgB,QAAQ,QAAQ,MAAM;AACtC,sBAAc,QAAQ,OAAO,MAAM;AACnC,YAAI,gBAAgB,KAAK,cAAc,GAAG;AAEzC;AAAA,QACD;AAAA,MACD;AAGA,UAAI,UAAU,QAAQ,QAAQ,aAAa,KAAK,CAAC;AAGjD,UAAI,SAAS;AACZ,YAAI,eAAe,GAAG;AACrB,gBAAM,QAAQ,QAAQ;AAAA,YACrB,QAAQ,KAAK,WAAW;AAAA,YACxB;AAAA,YACA,CAAC;AAAA,UACF;AAGA,oBAAU;AAAA,YACT;AAAA,YACA,SAAS,QAAQ,WAAW,KAAK,IAAI,KAAK,KAAK;AAAA,UAChD;AAAA,QACD;AAAA,MACD;AAEA,mBAAa,KAAK,gBAAgB,OAAO,WAAW,CAAC,QAAQ,OAAO;AAGpE,UAAI,CAAC,KAAK,WAAW,QAAQ,SAAS;AACrC,wBAAgB,KAAK,SAAS,MAAM,gBAAgB,GAAG;AAAA,MACxD,WAAW,KAAK,WAAW,CAAC,QAAQ,SAAS;AAC5C,wBAAgB,KAAK,SAAS,OAAO,gBAAgB,GAAG;AAAA,MACzD;AAGA,WAAK,QAAQ,QAAQ;AACrB,WAAK,UAAU,QAAQ;AAAA,IACxB,CAAC;AAGD,WAAO,KAAK,QAAQ,IAAI,EAAE,QAAQ,CAAC,SAAS;AAC3C,YAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAI,cAAc;AAGlB,UAAI,SAAS;AACZ,sBAAc,QAAQ,KAAK,IAAI;AAC/B,YAAI,cAAc,GAAG;AAEpB;AAAA,QACD;AAAA,MACD;AAGA,UAAI,QAAQ,QAAQ,KAAK,WAAW;AACpC,UAAI,OAAO,UAAU,aAAa;AACjC;AAAA,MACD;AACA,UAAI,SAAS;AACZ,gBAAQ,QAAQ,aAAa,OAAO,CAAC,MAAM,EAAE;AAAA,MAC9C;AAEA,UAAI,QAAQ,KAAK,KAAK,KAAK,KAAK;AAChC,UAAI,KAAK,KAAK,EAAE,YAAY,GAAG;AAC9B;AAAA,MACD;AACA,YAAM,UACL,KAAK,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,KAAK,KAAK,EAAE,SAAS;AAE7D,mBAAa,KAAK,gBAAgB,OAAO,QAAQ,CAAC,MAAM,KAAK;AAG7D,UAAI,CAAC,KAAK,KAAK,EAAE,WAAW,SAAS;AAEpC,YAAI,KAAK,CAAC,KAAK,EAAE,SAAS;AACzB,0BAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,OAAO,cAAc,GAAG;AAC9D,eAAK,CAAC,KAAK,EAAE,QAAQ;AACrB,eAAK,CAAC,KAAK,EAAE,UAAU;AAAA,QACxB;AAEA,wBAAgB,KAAK,KAAK,EAAE,SAAS,MAAM,cAAc,GAAG;AAAA,MAC7D,YAAY,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS;AACrE,gBAAQ,KAAK,KAAK,EAAE,UAAU,QAAQ,CAAC;AACvC,wBAAgB,KAAK,KAAK,EAAE,SAAS,OAAO,cAAc,GAAG;AAAA,MAC9D;AAGA,WAAK,KAAK,EAAE,QAAQ;AACpB,WAAK,KAAK,EAAE,UAAU;AAAA,IACvB,CAAC;AAAA,EACF,CAAC;AACF;AAGA,IACC,WAAW,aACX,OAAO,WAAW,UAAU,gBAAgB,YAC3C;AACD,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,mBAAmB,EAAE,OAAO;AAAA,IAC/C;AAAA,IACA;AAAA,EACD;AAKA,aAAW;AAAA,IACV;AAAA,IACA,CAAC,MAAM;AACN,mBAAa,KAAK,sBAAsB,EAAE,OAAO;AAAA,IAClD;AAAA,IACA;AAAA,EACD;AACD;AASO,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtB,MAAM;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACV;AACD;AAmBO,SAAS,YAAY,OAAO,QAAQ,SAAS;AAEnD,MAAI,CAAC,cAAc,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,EAC3D;AAIA,MACC,CAAC,aAAa,YAAY,oBAAoB,cAAc,KAC5D,OAAO,UAAU,gBAAgB,YAChC;AACD,iBAAa,YAAY,oBAAoB,cAAc;AAAA,EAC5D;AAGA,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,aAAS,KAAK,IAAI;AAAA,MACjB,MAAM,CAAC;AAAA,MACP,SAAS,CAAC;AAAA,IACX;AAAA,EACD;AAEA,QAAM,UAAU;AAAA,IACf;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW,OAAO;AAAA;AAAA,EACnB;AACA,QAAM,UAAU,SAAS,KAAK,EAAE,OAAO,IAAI;AAG3C,MAAI,OAAO,SAAS,WAAW;AAE9B,YAAQ,OAAO,IAAI,IAAI;AAAA,EACxB,WAAW,OAAO,SAAS,QAAQ;AAElC,UAAM,QAAQ,KAAK,KAAK,OAAO,SAAS,KAAK;AAE7C,QAAI,CAAC,QAAQ,OAAO,IAAI,GAAG;AAC1B,cAAQ,OAAO,IAAI,IAAI,CAAC;AAAA,IACzB;AACA,UAAM,OAAO,QAAQ,OAAO,IAAI;AAChC,SAAK,KAAK,IAAI;AAGd,QAAI,CAAC,KAAK,CAAC,KAAK,GAAG;AAClB,WAAK,CAAC,KAAK,IAAI;AAAA,QACd,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,CAAC;AAAA,MACb;AAAA,IACD;AAAA,EACD;AACD;AASO,SAAS,cAAc,OAAO,QAAQ;AAC5C,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,UAAM,IAAI,MAAM,6BAA6B,KAAK;AAAA,EACnD;AACA,WAAS,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;AACpC;AAOO,SAAS,mBAAmB,OAAO;AACzC,aAAW;AACZ;AAoCO,IAAM,oBAAoB;;;ACjf1B,IAAM,MAAM;AAAA,EAClB,WAAW;AAAA,EACX,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,WAAW;AAAA,EACX,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AACf;;;AH3FO,IAAI,iBAAiB;;;AIR5B,IAAM,aAAa;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,SAASC,OAAM,WAAmB;AACjC,SAAO,YAAY,YAAY,QAAS,CAAC,IAAI,WAAW,YAAY,EAAI;AACzE;AAEA,SAAS,QAAQ,GAAW,GAAW,GAAW;AACjD,MAAI,IAAI,GAAG;AACV,SAAK;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACV,SAAK;AAAA,EACN;AACA,MAAI,IAAI,IAAI,GAAG;AACd,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC1B;AACA,MAAI,IAAI,IAAI,GAAG;AACd,WAAO;AAAA,EACR;AACA,MAAI,IAAI,IAAI,GAAG;AACd,WAAO,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK;AAAA,EACpC;AACA,SAAO;AACR;AAEA,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SACL;AAED,IAAM,aAAa;AAAA;AAAA,EAElB,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,EACnB,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxB,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,EACtB,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,EACnB,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC;AAAA,EACxB,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC;AAAA,EACzB,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACrB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACpB,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EACvB,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EACxB,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACpB,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACpB,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EACtB,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA;AAAA,EAGtB,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,EAGxB,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,cAAc,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAC7B,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACvB,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5B,CAAC,aAAa,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,cAAc,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EAC5B,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5B,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EACxB,CAAC,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACzB,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACxB,CAAC,YAAY,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,iBAAiB,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAChC,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACzB,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,eAAe,CAAC,KAAK,GAAG,GAAG,CAAC;AAAA,EAC7B,CAAC,kBAAkB,CAAC,IAAI,KAAK,EAAE,CAAC;AAAA,EAChC,CAAC,cAAc,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EAC5B,CAAC,cAAc,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAC7B,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,EACvB,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,iBAAiB,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,EAC/B,CAAC,iBAAiB,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,EAC9B,CAAC,iBAAiB,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,EAC9B,CAAC,iBAAiB,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,cAAc,CAAC,KAAK,GAAG,GAAG,CAAC;AAAA,EAC5B,CAAC,YAAY,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAC3B,CAAC,eAAe,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,cAAc,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3B,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,eAAe,CAAC,IAAI,KAAK,EAAE,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EACtB,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5B,CAAC,eAAe,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC9B,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxB,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3B,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;AAAA,EACvB,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,iBAAiB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACjC,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,EAC3B,CAAC,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,wBAAwB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxC,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,iBAAiB,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC;AAAA,EAC3B,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,oBAAoB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACpC,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EAC1B,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAC/B,CAAC,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,CAAC,kBAAkB,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EACjC,CAAC,mBAAmB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACnC,CAAC,qBAAqB,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EACnC,CAAC,mBAAmB,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAClC,CAAC,mBAAmB,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAClC,CAAC,gBAAgB,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,EAC9B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/B,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5B,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC;AAAA,EAC1B,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,iBAAiB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACjC,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,iBAAiB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACjC,CAAC,iBAAiB,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACjC,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EACvB,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxB,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxB,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EAC7B,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC7B,CAAC,YAAY,CAAC,IAAI,KAAK,EAAE,CAAC;AAAA,EAC1B,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACxB,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,aAAa,CAAC,KAAK,IAAI,GAAG,CAAC;AAAA,EAC5B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACxB,CAAC,eAAe,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EAC7B,CAAC,aAAa,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,OAAO,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACvB,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,EACxB,CAAC,aAAa,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,EAC5B,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC1B,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC,cAAc,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9B,CAAC,eAAe,CAAC,KAAK,KAAK,EAAE,CAAC;AAC/B;AAIA,IAAM,WAAW,oBAAI,IAAkD;AACvE,WAAW,CAAC,MAAM,GAAG,KAAK,YAAY;AACrC,WAAS,IAAI,MAAM,GAAG;AACvB;AAKO,IAAM,QAAN,MAAY;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,YAAY,IAA6B,GAAG,IAAI,GAAG,IAAI,GAAGC,SAAQ,GAAK;AACtE,QAAI,OAAO,MAAM,UAAU;AAC1B,WAAK,UAAU,IAAI,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC5C,WAAK,SAAS,GAAG,GAAG,GAAGA,MAAK;AAAA,IAC7B,WAAW,OAAO,MAAM,UAAU;AACjC,WAAK,UAAU,IAAI,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC5C,WAAK,SAAS,CAAc;AAAA,IAC7B,WAAW,OAAO,MAAM,UAAU;AACjC,WAAK,UAAU,EAAE,QAAQ,MAAM;AAAA,IAChC,OAAO;AACN,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC3C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAI;AACP,WAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAO;AACZ,SAAK,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,GAAG,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAI;AACP,WAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAO;AACZ,SAAK,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,GAAG,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAI;AACP,WAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAO;AACZ,SAAK,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,GAAG,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,KAAK,QAAQ,CAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAM,OAAO;AAChB,SAAK,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,CAAG;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,IAAY,GAAG,IAAY,GAAG,IAAY,GAAGA,SAAQ,GAAK;AAClE,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,QAAQA;AAEb,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,GAAW,GAAW,GAAWA,SAAQ,GAAK;AACtD,UAAM,IAAI,KAAK;AACf,MAAE,CAAC,IAAI,MAAM,GAAG,GAAG,CAAG;AACtB,MAAE,CAAC,IAAI,MAAM,GAAG,GAAG,CAAG;AACtB,MAAE,CAAC,IAAI,MAAM,GAAG,GAAG,CAAG;AACtB,MAAE,CAAC,IAAI,MAAMA,QAAO,GAAG,CAAG;AAC1B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,GAAW,GAAW,GAAW;AACvC,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,UAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,UAAM,IAAI,IAAI,IAAI;AAClB,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,KAAK,IAAI,IAAI;AACvB,UAAM,IAAI,KAAK,KAAK,IAAI,KAAK;AAE7B,YAAS,IAAI,GAA6B;AAAA,MACzC,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,MACD,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,MACD,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,MACD,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,MACD,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,MACD,KAAK;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ;AAAA,IACF;AACA,WAAO,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,GAAW,GAAW,GAAW;AACvC,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,MAAM,GAAG;AACZ,UAAI,IAAI,IAAI;AAAA,IACb,OAAO;AACN,YAAM,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAC9C,YAAM,IAAI,IAAI,IAAI;AAElB,UAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAC3B,UAAI,QAAQ,GAAG,GAAG,CAAC;AACnB,UAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAAA,IAC5B;AAEA,WAAO,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,UAAU,IAAI,IAAa;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAuB;AAC3B,QAAI,OAAO,UAAU,UAAU;AAC9B,aAAO,KAAK,SAAS,KAAkB;AAAA,IACxC,OAAO;AACN,WAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAc;AACjB,SAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,GAAG,GAAG,CAAC;AAChE,SAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,GAAG,GAAG,CAAC;AAChE,SAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,GAAG,GAAG,CAAC;AAChE,SAAK,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,KAAK;AAEzD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOC,QAAe;AACrB,IAAAA,SAAQ,MAAMA,QAAO,GAAG,CAAC;AACzB,SAAK,QAAQ,CAAC,KAAKA;AACnB,SAAK,QAAQ,CAAC,KAAKA;AACnB,SAAK,QAAQ,CAAC,KAAKA;AAEnB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,OAAcD,QAAe;AACjC,IAAAA,SAAQ,MAAMA,QAAO,GAAG,CAAC;AACzB,SAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAC1D,SAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAC1D,SAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAE1D,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQC,QAAe;AACtB,IAAAA,SAAQ,MAAMA,QAAO,GAAG,CAAC;AACzB,SAAK,QAAQ,CAAC,IAAI;AAAA,MACjB,KAAK,QAAQ,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAAA,MAC1C;AAAA,MACA;AAAA,IACD;AACA,SAAK,QAAQ,CAAC,IAAI;AAAA,MACjB,KAAK,QAAQ,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAAA,MAC1C;AAAA,MACA;AAAA,IACD;AACA,SAAK,QAAQ,CAAC,IAAI;AAAA,MACjB,KAAK,QAAQ,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAKA;AAAA,MAC1C;AAAA,MACA;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM,GAAG,MAAM,KAAK;AAC1B,QAAI,MAAM,GAAG;AACZ,YAAM;AAAA,IACP;AACA,QAAI,MAAM,KAAK;AACd,YAAM;AAAA,IACP;AAEA,WAAO,KAAK;AAAA,MACX,OAAO,KAAK,GAAG;AAAA,MACf,OAAO,KAAK,GAAG;AAAA,MACf,OAAO,KAAK,GAAG;AAAA,MACf,KAAK;AAAA,IACN;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAc;AACpB,WACC,KAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KACnC,KAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KACnC,KAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,KACnC,KAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC;AAAA,EAErC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,UAAkB;AAC1B,UAAM,MAAM,SAAS,IAAI,QAAqB;AAC9C,QAAI,CAAC,KAAK;AACT,aAAO,KAAK,SAAS,QAAQ;AAAA,IAC9B;AACA,WAAO,KAAK,SAAS,GAAG,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,UAAkB;AAG1B,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,QAAI,CAAC,OAAO;AACX,aAAO,KAAK,SAAS,QAAwB;AAAA,IAC9C;AACA,WAAO,KAAK;AAAA,MACX,CAAC,MAAM,CAAC;AAAA,MACR,CAAC,MAAM,CAAC;AAAA,MACR,CAAC,MAAM,CAAC;AAAA,MACR,OAAO,MAAM,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI;AAAA,IAC/C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,UAAwB,OAAO,OAAO;AAG9C,QAAI;AACJ,QAAK,QAAQ,OAAO,KAAK,QAAQ,GAAI;AAEpC,aAAO,KAAK;AAAA,QACX,SAAS,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE;AAAA;AAAA,QACjC,SAAS,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE;AAAA;AAAA,QACjC,SAAS,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE;AAAA;AAAA,QACjC;AAAA,WACE,MAAM,SAAS,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAO;AAAA,YAC3D;AAAA,UACD;AAAA,QACD;AAAA;AAAA,MACD;AAAA,IACD;AAEA,QAAK,QAAQ,OAAO,KAAK,QAAQ,GAAI;AAEpC,aAAO,KAAK;AAAA,QACX,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,QACrB,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,QACrB,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,MACtB;AAAA,IACD;AAEA,QAAK,QAAQ,OAAO,KAAK,QAAQ,GAAI;AAEpC,YAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC;AAC7B,YAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC;AAC7B,YAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC;AAC7B,YAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC;AAC7B,aAAO,KAAK;AAAA,QACX,SAAS,IAAI,GAAG,EAAE;AAAA;AAAA,QAClB,SAAS,IAAI,GAAG,EAAE;AAAA;AAAA,QAClB,SAAS,IAAI,GAAG,EAAE;AAAA;AAAA,QAClB,QAAQ,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAO,QAAQ,CAAC,CAAC;AAAA;AAAA,MAC/D;AAAA,IACD;AAEA,QAAK,QAAQ,OAAO,KAAK,QAAQ,GAAI;AAEpC,aAAO,KAAK;AAAA,QACX,SAAS,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE;AAAA,QAChC,SAAS,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE;AAAA,QAChC,SAAS,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE;AAAA,MACjC;AAAA,IACD;AAEA,UAAM,IAAI,MAAM,sBAAsB,QAAQ,EAAE;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAASD,SAAQ,GAAK;AACrB,UAAM,IAAI,KAAK;AAEf,UAAM,KAAM,EAAE,CAAC,IAAI,OAAQ;AAC3B,UAAM,KAAM,EAAE,CAAC,IAAI,OAAQ;AAC3B,UAAM,KAAM,EAAE,CAAC,IAAI,OAAQ;AAE3B,WAAUA,SAAQ,OAAQ,KAAM,KAAO,MAAM,KAAO,MAAM,IAAK;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAIP,WAAO,IAAID,OAAM,KAAK,CAAC,CAAC,GAAGA,OAAM,KAAK,CAAC,CAAC,GAAGA,OAAM,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOC,SAAQ,KAAK,OAAO;AAI1B,WAAO,IAAID,OAAM,KAAK,CAAC,CAAC,GAAGA,OAAM,KAAK,CAAC,CAAC,GAAGA,OAAM,KAAK,CAAC,CAAC,GAAGA,OAAMC,SAAQ,GAAG,CAAC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAIP,WAAO,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOA,SAAQ,KAAK,OAAO;AAI1B,WAAO,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAIA,MAAK;AAAA,EACnD;AACD;AAEO,IAAM,YAAY,WAQvB,CAAC,GAAG,GAAG,GAAGA,WAAU;AACrB,QAAM,QAAQ,IAAI,MAAM,GAAG,GAAG,GAAGA,MAAK;AACtC,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAME,IAAGC,IAAGC,IAAGJ,QAAO;AACrB,UAAI,UAAU,WAAW,GAAG;AAC3B,cAAM,SAAS;AAAA,MAChB,OAAO;AACN,YAAI,OAAOE,OAAM,UAAU;AAC1B,gBAAM,SAASA,IAAGC,IAAGC,IAAGJ,MAAK;AAAA,QAC9B,OAAO;AACN,gBAAM,KAAKE,EAAmB;AAAA,QAC/B;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;;;ACntBM,IAAM,WAAN,MAAM,UAAS;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAChC,SAAK,aAAa,GAAG,GAAG,CAAC;AAAA,EAC1B;AAAA,EAEA,aAAa,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AACjC,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,IAAI;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,GAAW,GAAW,IAAwB,GAAG;AACpD,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,IAAI;AACT,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,IAAI,GAAG,GAAG,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAwB;AAC5B,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,IAAI,MAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAwB;AAC3B,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAwB;AAC3B,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAW,IAAI,GAAG,IAAI,GAAG;AAC9B,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAW;AACd,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AACL,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAa,MAAc;AAChC,WAAO,IAAI;AAAA,MACV,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,MACvB,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,MACvB,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAa,MAAc;AACpC,WAAO,KAAK;AAAA,MACX,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,MACvB,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,MACvB,MAAM,KAAK,GAAG,KAAK,IAAI;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAwB;AAC5B,UAAM,MAAM,OAAO,IAAI,EAAE,IAAI;AAC7B,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAwB;AAC5B,UAAM,MAAM,OAAO,IAAI,EAAE,IAAI;AAC7B,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,IAAI;AAAA,MACV,KAAK,MAAM,KAAK,CAAC;AAAA,MACjB,KAAK,MAAM,KAAK,CAAC;AAAA,MACjB,KAAK,MAAM,KAAK,CAAC;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,IAAI;AAAA,MACV,KAAK,KAAK,KAAK,CAAC;AAAA,MAChB,KAAK,KAAK,KAAK,CAAC;AAAA,MAChB,KAAK,KAAK,KAAK,CAAC;AAAA,IACjB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,IAAI,UAAS,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAwB;AAC5B,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UACI,MAMO;AACV,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,WAAW,GAAG;AACtB,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,eAAe,YAAY,eAAe,WAAU;AACvD,SAAC,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,MAAM,IAAI,IAAI,KAAK,CAAC;AAAA,MAC1D,OAAO;AACN,aAAK;AACL,aAAK,KAAK;AACV,aAAK,KAAK;AAAA,MACX;AAAA,IACD,WAAW,KAAK,WAAW,GAAG;AAC7B,OAAC,IAAI,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAAA,IACzC,OAAO;AACN,OAAC,IAAI,IAAI,EAAE,IAAI;AAAA,IAChB;AAEA,WAAO,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAa;AAClC,QAAI,KAAK;AACT,QAAI,KAAK;AAET,QAAI,GAAG;AACN,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACR;AAGA,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,KAAK,IAAI;AAEnB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AAExB,WAAO,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAwB;AAC3B,WAAO,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,KAAK;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAa;AAClB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE;AAEb,SAAK,IAAI,KAAK,KAAK,KAAK;AACxB,SAAK,IAAI,KAAK,KAAK,KAAK;AACxB,SAAK,IAAI,KAAK,KAAK,KAAK;AAExB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAkB;AACjB,WAAO,KAAK,IAAI,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,KAAK,KAAK,QAAQ,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,GAAaG,QAAe;AAChC,SAAK,MAAM,EAAE,IAAI,KAAK,KAAKA;AAC3B,SAAK,MAAM,EAAE,IAAI,KAAK,KAAKA;AAC3B,SAAK,MAAM,EAAE,IAAI,KAAK,KAAKA;AAC3B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAA6B,MAAc;AACtD,UAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC;AAE7D,UAAM,KAAK,KAAK,IAAI,OAAO;AAC3B,UAAM,KAAK,KAAK,IAAI,OAAO;AAE3B,UAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAE5C,QAAI,aAAa,KAAM,QAAQ,KAAK,YAAY,OAAO,MAAO;AAC7D,aAAO;AAAA,IACR;AAEA,SAAK,KAAK,KAAK,IAAI,KAAK,IAAI;AAC5B,SAAK,KAAK,KAAK,IAAI,KAAK,IAAI;AAE5B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAAwB;AAChC,UAAM,KAAK,KAAK,IAAI,EAAE;AACtB,UAAM,KAAK,KAAK,IAAI,EAAE;AACtB,UAAM,KAAK,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI;AACtC,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAwB;AAC7B,WAAO,KAAK,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,GAAwB;AAC/B,UAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ;AACtC,WAAO,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAwB;AAChC,UAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ;AACtC,WAAO,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,aAAa,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,EAC3C;AACD;AAEO,IAAM,eAAe,WAG1B,CAAC,GAAG,GAAG,MAAM;AACd,QAAM,SAAS,IAAI,SAAS,GAAG,GAAG,CAAC;AAEnC,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,KAAI,GAAGC,KAAI,GAAGC,KAAI,GAAG;AAC1B,aAAO,IAAIF;AACX,aAAO,IAAIC;AACX,aAAO,IAAIC;AAAA,IACZ;AAAA,EACD;AACD,CAAC;;;AC3cD,IAAM,QAAQ,CAAC,aAAuB,UAA0B;AAC/D,MAAI,MAAM,CAAC,aAAa,UAAU;AACjC,aAAS,KAAK,MAAM,CAAC,CAAC;AAAA,EACvB,WAAW,OAAO,MAAM,CAAC,MAAM,UAAU;AACxC,aAAS,aAAa,GAAG,KAAK;AAAA,EAC/B,OAAO;AACN,aAAS,SAAS;AAAA,EACnB;AACD;AAKO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAIrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAuB;AACrC,SAAK,MAAM,IAAI,aAAa,EAAE;AAC9B,UAAM,MAAM,GAAG,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACR,WAAO,KAAK,IAAI,EAAE;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACR,WAAO,KAAK,IAAI,EAAE;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACR,WAAO,KAAK,IAAI,EAAE;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACV,WAAO,KAAK,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,QAAwB;AACvC,UAAM,IAAI,KAAK;AAEf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,CAAC,IAAI,OAAO,CAAC;AACf,MAAE,EAAE,IAAI,OAAO,EAAE;AACjB,MAAE,EAAE,IAAI,OAAO,EAAE;AACjB,MAAE,EAAE,IAAI,OAAO,EAAE;AACjB,MAAE,EAAE,IAAI,OAAO,EAAE;AACjB,MAAE,EAAE,IAAI,OAAO,EAAE;AACjB,MAAE,EAAE,IAAI,OAAO,EAAE;AAEjB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,SAAK,IAAI,IAAI,EAAE,GAAG;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAa;AACtB,UAAM,IAAI,EAAE;AACZ,WAAO,KAAK;AAAA,MACX,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH;AAAA,MACA,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH;AAAA,MACA,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH,EAAE,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAAa;AACrB,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,EAAE;AAEZ,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,QAAI,KAAK,EAAE,CAAC;AACZ,QAAI,KAAK,EAAE,CAAC;AACZ,QAAI,KAAK,EAAE,CAAC;AACZ,QAAI,KAAK,EAAE,CAAC;AAEZ,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAE7C,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,CAAC;AAER,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAE7C,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,EAAE;AACT,SAAK,EAAE,EAAE;AAET,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC9C,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAE9C,SAAK,EAAE,EAAE;AACT,SAAK,EAAE,EAAE;AACT,SAAK,EAAE,EAAE;AACT,SAAK,EAAE,EAAE;AAET,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC9C,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC9C,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAC9C,MAAE,EAAE,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK;AAE9C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,UAAM,IAAI,KAAK;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,EAAE;AAEhB,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI,EAAE,EAAE;AACX,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI,EAAE,EAAE;AACX,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,EAAE,IAAI,EAAE,EAAE;AACZ,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,IAAI;AAER,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,UAAM,IAAI,KAAK;AAEf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAChB,UAAM,MAAM,EAAE,EAAE;AAEhB,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAE9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAE9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAG9B,QAAI,MACH,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AAEnE,QAAI,CAAC,KAAK;AACT,aAAO,KAAK,SAAS;AAAA,IACtB;AAEA,UAAM,IAAI;AAEV,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC7C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC9C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC9C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC9C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC9C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAC9C,MAAE,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAE9C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAgC;AACrC,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,OAAO,IAAI,EAAE,IAAI;AAE3B,UAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK;AAErD,MAAE,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK;AACjD,MAAE,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK;AAEjD,QAAI,OAAO,GAAG;AACb,QAAE,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK;AAAA,IACnD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,GAAwB;AAEpC,UAAM,KAAK,aAAa,IAAI,IAAI,EAAE,OAAO;AAEzC,OAAG,MAAM,CAAC;AAEV,iBAAa,QAAQ,EAAE;AAEvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MACC,MACA,OACA,QACA,KACA,MACA,KACC;AACD,UAAM,IAAI,KAAK;AACf,UAAM,YAAY,KAAO,OAAO;AAChC,UAAM,YAAY,KAAO,SAAS;AAClC,UAAM,UAAU,KAAO,OAAO;AAE9B,MAAE,CAAC,IAAI,KAAO;AACd,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,KAAO;AACd,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,EAAE,IAAI,IAAM;AACd,MAAE,EAAE,IAAI;AACR,MAAE,EAAE,KAAK,OAAO,SAAS;AACzB,MAAE,EAAE,KAAK,MAAM,UAAU;AACzB,MAAE,EAAE,KAAK,MAAM,QAAQ;AACvB,MAAE,EAAE,IAAI;AAER,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAW,IAAI,GAAG,IAAI,GAAG;AAC9B,UAAM,IAAI,KAAK;AAEf,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AAEd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AAEd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACd,MAAE,EAAE,IAAI,EAAE,EAAE,IAAI;AAChB,MAAE,EAAE,IAAI,EAAE,EAAE,IAAI;AAEhB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAW;AACjB,WAAO,KAAK,MAAM,GAAG,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAW;AACjB,WAAO,KAAK,MAAM,GAAG,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAa;AAClC,QAAI,UAAU,GAAG;AAChB,YAAM,IAAI,KAAK;AACf,UAAI,IAAI,EAAE;AACV,UAAI,IAAI,EAAE;AACV,UAAI,IAAI,EAAE;AAEV,UAAI,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAEzC,UAAI,MAAM,SAAS;AAClB,eAAO;AAAA,MACR;AAEA,YAAM,IAAI;AACV,WAAK;AACL,WAAK;AACL,WAAK;AAEL,YAAM,IAAI,KAAK,IAAI,KAAK;AACxB,YAAM,IAAI,KAAK,IAAI,KAAK;AACxB,YAAM,IAAI,IAAI;AAEd,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,CAAC;AACf,YAAM,MAAM,EAAE,EAAE;AAChB,YAAM,MAAM,EAAE,EAAE;AAGhB,YAAM,MAAM,IAAI,IAAI,IAAI;AACxB,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI;AACxB,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAC5B,YAAM,MAAM,IAAI,IAAI,IAAI;AAGxB,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,QAAE,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACtC,QAAE,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACR;AAAA,EAWA,UAAU,WAAyC,GAAY,GAAY;AAC1E,UAAM,IAAI,KAAK;AACf,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,WAAW,qBAAqB,UAAU;AACzC,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK;AAAA,IACN,OAAO;AACN,WAAK;AACL,WAAK;AACL,WAAK,KAAK;AAAA,IACX;AAEA,MAAE,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE;AAChD,MAAE,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE;AAChD,MAAE,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE;AACjD,MAAE,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE;AAEjD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,UAAM,IAAI,KAAK;AAEf,WACC,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,CAAC,MAAM,KACT,EAAE,EAAE,MAAM,KACV,EAAE,EAAE,MAAM,KACV,EAAE,EAAE,MAAM,KACV,EAAE,EAAE,MAAM,KACV,EAAE,EAAE,MAAM,KACV,EAAE,EAAE,MAAM;AAAA,EAEZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,KAAK;AAEf,WACC,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,CAAC,MAAM,EAAE,CAAC,KACZ,EAAE,EAAE,MAAM,EAAE,EAAE,KACd,EAAE,EAAE,MAAM,EAAE,EAAE,KACd,EAAE,EAAE,MAAM,EAAE,EAAE,KACd,EAAE,EAAE,MAAM,EAAE,EAAE,KACd,EAAE,EAAE,MAAM,EAAE,EAAE,KACd,EAAE,EAAE,MAAM,EAAE,EAAE;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,aAAa,IAAI,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,UAAM,IAAI,KAAK;AAEf,WAAO,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KACnE,EAAE,CAAC,CACJ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAClE,EAAE,EAAE,CACL,KAAK,EAAE,EAAE,CAAC;AAAA,EACX;AACD;AAEO,IAAM,eAAe;AAAA,EAC3B,IAAI,WAAW;AACd,UAAM,WAAW,IAAI,SAAS,GAAG,MAAM;AAEvC,WAAO;AAAA,MACN;AAAA,MACA,SAAS,OAAO;AACf,cAAM,UAAU,GAAG,KAAK;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;ACzoBA,IAAMC,SAAQ,CAAC,aAAuB,UAA0B;AAC/D,MAAI,MAAM,CAAC,aAAa,UAAU;AACjC,aAAS,UAAU,MAAM,CAAC,CAAC;AAAA,EAC5B,WAAW,MAAM,CAAC,aAAa,UAAU;AACxC,aAAS,KAAK,MAAM,CAAC,CAAC;AAAA,EACvB,WAAW,OAAO,MAAM,CAAC,MAAM,UAAU;AACxC,aAAS,aAAa,GAAG,KAAK;AAAA,EAC/B,OAAO;AACN,aAAS,SAAS;AAAA,EACnB;AACD;AAOO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAIrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAuB;AACrC,SAAK,MAAM,IAAI,aAAa,CAAC;AAC7B,IAAAA,OAAM,MAAM,GAAG,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACR,WAAO,KAAK,IAAI,CAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACR,WAAO,KAAK,IAAI,CAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACV,SAAK,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC3C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBACI,QAGF;AACD,QAAI,OAAO,WAAW,GAAG;AACxB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AAAA,IACvB,WAAW,OAAO,WAAW,GAAG;AAC/B,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI,OAAO,CAAC;AACtB,WAAK,IAAI,CAAC,IAAI;AACd,WAAK,IAAI,CAAC,IAAI;AACd,WAAK,IAAI,CAAC,IAAI;AAAA,IACf;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAW,GAAW,GAAW,GAAW,GAAW,GAAW;AAC3E,UAAM,IAAI,KAAK;AACf,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK;AAEX,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,KAAK,KAAK,KAAK,KAAK;AACvB,MAAE,CAAC,KAAK,KAAK,KAAK,KAAK;AAEvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAa;AACjB,SAAK,IAAI,IAAI,EAAE,GAAG;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAa;AACtB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,SAAK,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAEtB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAAa;AACrB,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,KAAK;AACf,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AAEd,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,IAAI,KAAK,KAAK,KAAK;AACtB,MAAE,CAAC,KAAK,KAAK,KAAK,KAAK;AACvB,MAAE,CAAC,KAAK,KAAK,KAAK,KAAK;AAEvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,UAAM,IAAI,KAAK;AACf,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,CAAC;AAEd,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,EAAE,CAAC;AACV,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AAEP,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,UAAM,MAAM,KAAK;AAEjB,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,CAAC;AAEf,UAAM,KAAK,IAAI,IAAI,IAAI;AACvB,UAAM,KAAK,IAAI,IAAI,IAAI;AACvB,UAAM,KAAK,IAAI,IAAI,IAAI;AAEvB,UAAM,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI;AAEhC,QAAI,CAAC,IAAI,KAAK;AACd,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAC3B,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAE3B,QAAI,CAAC,IAAI,KAAK;AACd,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAC3B,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAE3B,QAAI,CAAC,IAAI,KAAK;AACd,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAC3B,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK;AAE3B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAgC;AACrC,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,OAAO,IAAI,EAAE,IAAI;AAE3B,MAAE,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AACnC,MAAE,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAEnC,QAAI,OAAO,GAAG;AACb,QAAE,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,IACpC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,GAAa;AACzB,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,EAAE;AAEZ,UAAM,OAAO,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AAE3C,MAAE,IACD,EAAE,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AACpE,MAAE,IACD,EAAE,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AAErE,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAW,IAAI,GAAG;AACvB,UAAM,IAAI,KAAK;AAEf,MAAE,CAAC,KAAK;AACR,MAAE,CAAC,KAAK;AAGR,MAAE,CAAC,KAAK;AACR,MAAE,CAAC,KAAK;AAGR,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAW;AACjB,WAAO,KAAK,MAAM,GAAG,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAW;AACjB,WAAO,KAAK,MAAM,GAAG,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAe;AACrB,QAAI,UAAU,GAAG;AAChB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,MAAM,KAAK,IAAI,CAAC;AACtB,YAAM,IAAI,KAAK,IAAI,KAAK;AACxB,YAAM,IAAI,KAAK,IAAI,KAAK;AAExB,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC5B,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC5B,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAE5B,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC5B,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC5B,WAAK,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AAAA,EAUA,UAAU,WAA8B,GAAY;AACnD,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAEA,SAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;AAChD,SAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;AAEhD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WACC,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM,KAChB,KAAK,IAAI,CAAC,MAAM;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WACC,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KACvB,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,aAAa,IAAI,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,UAAM,IAAI,KAAK;AAEf,WAAO,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KACnE,EAAE,CAAC,CACJ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAAA,EACnB;AACD;AAEO,IAAM,eAAe;AAAA,EAC3B,IAAI,WAAW;AACd,UAAM,WAAW,IAAI,SAAS,GAAG,MAAM;AAEvC,WAAO;AAAA,MACN;AAAA,MACA,SAAS,OAAO;AACf,QAAAA,OAAM,UAAU,GAAG,KAAK;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACD;;;ACrdA,IAAM,sBAAsB,CAAC,KAAK,KAAK,GAAG;AAK1C,IAAM,kBAAkB,IAAI,IAAwB,mBAAmB;AAEvE,IAAM,uBAAuB,CAC5B,aACoC;AACpC,SAAO,gBAAgB,IAAI,QAAe;AAC3C;AAKO,IAAM,qBAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,kBAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnC,YACC,IAAY,GACZ,IAAY,GACZ,IAAY,GACZ,UACC;AACD,UAAM,EAAE,OAAO,OAAO,IAAI,MAAM,UAAU,IAAI,SAAS,GAAG,GAAG,CAAC,GAAG;AAAA,MAChE,KAAK,CAAC,QAAQ,UAAU,UAAU;AACjC,YAAI,qBAAqB,QAAQ,GAAG;AACnC,kBAAQ,IAAI,QAAQ,UAAU,KAAK;AACnC,cAAI,KAAK,iBAAiB;AACzB,iBAAK,YAAY;AAAA,UAClB;AACA,iBAAO;AAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAED,SAAK,UAAU;AACf,SAAK,YAAY;AAEjB,QAAI,UAAU;AACb,WAAK,YAAY,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AACxB,SAAK,kBAAkB;AACvB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,YAAY;AACjB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAC7B,SAAK,kBAAkB;AACvB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,IAAI;AACP,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,IAAI,EAAE,OAAe;AACpB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAsB;AACjC,SAAK,YAAY;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,IAAI,GAAG,GAAG,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAA6C;AACjD,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,IAAI,MAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAA6C;AAChD,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAA6C;AAChD,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAW,IAAI,GAAG,IAAI,GAAG;AAC9B,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAkC;AACxC,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAW;AACd,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AACL,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAa,MAAc;AAChC,WAAO,KAAK,UAAU,MAAM,KAAK,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAa,MAAc;AACpC,WAAO,KAAK,UAAU,UAAU,KAAK,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAA6C;AACjD,UAAM,MAAM,OAAO,IAAI,EAAE,IAAI;AAC7B,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAA6C;AACjD,UAAM,MAAM,OAAO,IAAI,EAAE,IAAI;AAC7B,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC1B,KAAK,IAAI,MAAM,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,UAAU,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,UAAU,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,UAAU,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK,UAAU,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAA6C;AACjD,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UACI,MAOO;AACV,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,WAAW,GAAG;AACtB,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,OAAO,QAAQ,UAAU;AAC5B,SAAC,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,MAAM,IAAI,IAAI,KAAK,CAAC;AAAA,MAC1D,OAAO;AACN,aAAK;AACL,aAAK,KAAK;AACV,aAAK,KAAK;AAAA,MACX;AAAA,IACD,WAAW,KAAK,WAAW,GAAG;AAC7B,OAAC,IAAI,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAAA,IACzC,OAAO;AACN,OAAC,IAAI,IAAI,EAAE,IAAI;AAAA,IAChB;AAEA,WAAO,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,UAAU,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACN,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAsB;AAC3C,QAAI,KAAK;AACT,QAAI,KAAK;AAET,QAAI,GAAG;AACN,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACR;AAGA,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,KAAK,IAAI;AAEnB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AAExB,WAAO,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAA6C;AAChD,WAAO,KAAK,UAAU,IAAI,CAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAkC;AACvC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE;AAEb,SAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AAEhE,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAkB;AACjB,WAAO,KAAK,UAAU,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,GAAkCC,QAAe;AACrD,SAAK;AAAA,MACJ,KAAK,KAAK,EAAE,IAAI,KAAK,KAAKA;AAAA,MAC1B,KAAK,KAAK,EAAE,IAAI,KAAK,KAAKA;AAAA,MAC1B,KAAK,KAAK,EAAE,IAAI,KAAK,KAAKA;AAAA,IAC3B;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAkD,MAAc;AAC3E,UAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC;AAE7D,UAAM,KAAK,KAAK,IAAI,OAAO;AAC3B,UAAM,KAAK,KAAK,IAAI,OAAO;AAE3B,UAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAE5C,QAAI,aAAa,KAAM,QAAQ,KAAK,YAAY,OAAO,MAAO;AAC7D,aAAO;AAAA,IACR;AAEA,SAAK;AAAA,MACJ,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,MAC3B,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,MAC3B,KAAK;AAAA,IACN;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAA6C;AACrD,WAAO,KAAK,UAAU,SAAS,CAAa;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAA6C;AAClD,WAAO,KAAK,UAAU,MAAM,CAAa;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,GAA6C;AACpD,UAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ;AACtC,WAAO,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAA6C;AACrD,UAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ;AACtC,WAAO,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAiB;AACtB,WAAO,uBAAuB,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,UAAU,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACR,SAAK,QAAQ;AAAA,EACd;AACD;AAEO,IAAM,yBAAyB,WAQpC,CAAC,GAAG,GAAG,GAAG,OAAO;AAClB,QAAM,SAAS,IAAI,mBAAmB,GAAG,GAAG,GAAG,EAAE;AAEjD,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,KAAI,GAAGC,KAAI,GAAGC,KAAI,GAAGC,KAAuB;AACjD,aAAO,SAASH,IAAGC,IAAGC,EAAC;AACvB,UAAIC,KAAI;AACP,eAAO,YAAYA,GAAE;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AACD,CAAC;;;AClkBM,IAAM,UAAN,MAAM,SAAQ;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,YAAY,GAAW,GAAW,GAAW,GAAW;AACvD,SAAK,MAAM,IAAI,SAAS;AACxB,SAAK,UAAU,IAAI,OAAO;AAC1B,SAAK,SAAS;AACd,SAAK,UAAU,IAAI,SAAS;AAC5B,SAAK,WAAW,IAAI,SAAS;AAC7B,SAAK,QAAQ,aAAa,IAAI;AAC9B,SAAK,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,GAAW,GAAW,GAAW,GAAW;AACpD,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,SAAS,KAAK,IAAI,IAAI,EAAE;AAC9B,UAAM,IAAI,SAAS;AAEnB,SAAK,IAAI,IAAI,GAAG,CAAC;AACjB,SAAK,SAAS;AACd,SAAK,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM;AACvC,SAAK,QAAQ,IAAI,QAAQ,MAAM,EAAE,OAAO,KAAK,KAAK;AAClD,SAAK,SAAS,IAAI,GAAG,CAAC,EAAE,OAAO,KAAK,KAAK;AAEzC,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO,UAAU,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,WAAO,UAAU,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,QAAQ,CAAC;AAEjD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAc;AACnC,UAAM,SAAS,KAAK,UAAU;AAE9B,SAAK,IAAI,OAAO,OAAO,CAAC;AACxB,WAAO,MAAM,KAAK,GAAG;AACrB,WAAO,UAAU,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,QAAQ,CAAC;AACjD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAW,IAAI,GAAG;AACvB,WAAO,KAAK;AAAA,MACX,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,QAAQ,IAAI,IAAI;AAAA,MACrB,KAAK,QAAQ,IAAI,IAAI;AAAA,IACtB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAa;AACnB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AAEX,WAAO;AAAA,EACR;AAAA,EAcA,UAAU,WAA8B,GAAY;AACnD,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAEA,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,SAAK,UAAU,EAAE,UAAU,IAAI,EAAE;AAEjC,WAAO;AAAA,EACR;AAAA,EAmBA,SAAS,WAA8B,GAAY;AAClD,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,OAAC,IAAI,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAAA,IACrC,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAGA,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AAEf,WAAQ,KAAK,KAAM,KAAK,SAAS,IAAK,KAAK,KAAM,KAAK,SAAS,KAAK;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,QAAI,OAAO,KAAK,YAAY,aAAa;AACxC,WAAK,UAAU,WAAW,IAAI;AAAA,IAC/B;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ,IAAI;AAAA,IAClB;AAAA,EACD;AACD;AAEO,IAAM,cAAc,WAGzB,CAAC,GAAG,GAAG,OAAO,WAAW;AAC1B,QAAM,WAAW,IAAI,QAAQ,GAAG,GAAG,OAAO,MAAM;AAEhD,SAAO;AAAA,IACN;AAAA,IACA,MAAMC,IAAGC,IAAGC,QAAOC,SAAQ;AAC1B,eAAS,SAASH,IAAGC,IAAGC,QAAOC,OAAM;AAAA,IACtC;AAAA,EACD;AACD,CAAC;;;ACrOM,IAAM,OAAN,MAAM,cAAa,QAAQ;AAAA,EAiBxB,SAAS,WAA8B,GAAY;AAC3D,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAIA,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,CAAC,OAAO,GAAG,IAAI,KAAK;AAG1B,YACE,KAAK,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,IAAI,MAAM,MAAM,KAAK,MAAM;AAAA,EAEzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,SAAS;AACjB,UAAM,QAAQ,KAAK;AACnB,UAAM,UAAU,KAAK;AACrB,UAAM,UAAU,KAAK;AAGrB,UAAM,SAAS,KAAK;AAEpB,QAAI,OAAO,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC5C;AAGA,QAAI,MAAM,CAAC,MAAM,QAAW;AAC3B,YAAM,CAAC,IAAI,aAAa,IAAI;AAAA,IAC7B;AACA,UAAM,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC;AACtC,QAAI,QAAQ,CAAC,MAAM,QAAW;AAC7B,cAAQ,CAAC,IAAI,aAAa,IAAI;AAAA,IAC/B;AACA,YAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU;AAI3C,YAAQ,SAAS;AAEjB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,QAAQ;AAChB,WAAO,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAAA,IACzC;AAAA,EACD;AACD;AAEO,IAAM,WAAW,WAGtB,CAAC,GAAG,GAAG,WAAW;AACnB,QAAM,OAAO,IAAI,KAAK,GAAG,GAAG,MAAM;AAClC,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,IAAGC,IAAGC,SAAQ;AACnB,WAAK,IAAI,IAAIF,IAAGC,EAAC;AACjB,WAAK,YAAYC,OAAM;AAAA,IACxB;AAAA,EACD;AACD,CAAC;;;ACxGD,IAAM,iBAAiB;AAKhB,IAAM,YAAN,MAAM,mBAAkB,KAAK;AAAA;AAAA;AAAA;AAAA,EAInC;AAAA;AAAA;AAAA;AAAA,EAKS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShB,YACC,GACA,GACA,OACA,QACA,SAAS,gBACR;AACD,UAAM,GAAG,GAAG,OAAO,MAAM;AACzB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,IAAI,OAAO,OAAO;AAEjB,QAAI,KAAK,QAAQ,IAAI,OAAO;AAC3B,cAAQ,KAAK,QAAQ;AAAA,IACtB;AACA,QAAI,KAAK,SAAS,IAAI,OAAO;AAC5B,cAAQ,KAAK,SAAS;AAAA,IACvB;AACA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,KAAK,OAAkB;AAC/B,SAAK,IAAI,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;AACrC,SAAK,QAAQ,MAAM,OAAO,MAAM,MAAM;AACtC,SAAK,SAAS,MAAM;AACpB,WAAO;AAAA,EACR;AAAA,EAqBS,SAAS,WAA8B,GAAY;AAC3D,QAAI;AACJ,QAAI;AAEJ,QAAI,qBAAqB,UAAU;AAClC,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK;AACL,WAAK;AAAA,IACN;AAGA,QACC,KAAK,KAAK,QACV,MAAM,KAAK,SACX,KAAK,KAAK,OACV,MAAM,KAAK,QACV;AACD,aAAO;AAAA,IACR;AAGA,QACE,MAAM,KAAK,OAAO,KAAK,UAAU,MAAM,KAAK,QAAQ,KAAK,UACzD,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,KAAK,SAAS,KAAK,QACzD;AACD,aAAO;AAAA,IACR;AAGA,QAAI;AACJ,QAAI;AACJ,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACjE,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAK,SAAS,CAAC,CAAC;AAElE,QAAI,KAAK,KAAK,OAAO,WAAW,KAAK,KAAK,MAAM,SAAS;AACxD,WAAK,KAAK,KAAK,OAAO;AACtB,WAAK,KAAK,KAAK,MAAM;AAAA,IACtB,WAAW,KAAK,KAAK,QAAQ,WAAW,KAAK,KAAK,MAAM,SAAS;AAChE,WAAK,KAAK,KAAK,QAAQ;AACvB,WAAK,KAAK,KAAK,MAAM;AAAA,IACtB,WAAW,KAAK,KAAK,QAAQ,WAAW,KAAK,KAAK,SAAS,SAAS;AACnE,WAAK,KAAK,KAAK,QAAQ;AACvB,WAAK,KAAK,KAAK,SAAS;AAAA,IACzB,WAAW,KAAK,KAAK,OAAO,WAAW,KAAK,KAAK,SAAS,SAAS;AAClE,WAAK,KAAK,KAAK,OAAO;AACtB,WAAK,KAAK,KAAK,SAAS;AAAA,IACzB,OAAO;AACN,aAAO;AAAA,IACR;AAGA,WAAO,KAAK,KAAK,KAAK,MAAM,UAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,OAAO,OAAkB;AACjC,WAAO,MAAM,OAAO,KAAK,KAAK,KAAK,WAAW,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,QAAQ;AAChB,WAAO,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EACD;AACD;AAEO,IAAM,uBAAuB,WASlC,CAAC,GAAG,GAAG,OAAO,QAAQ,WAAW;AAClC,QAAM,mBAAmB,IAAI,UAAU,GAAG,GAAG,OAAO,QAAQ,MAAM;AAClE,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,IAAGC,IAAGC,QAAOC,SAAQC,UAAS,gBAAgB;AACnD,uBAAiB,IAAI,IAAIJ,IAAGC,EAAC;AAC7B,uBAAiB,QAAQC,QAAOC,OAAM;AACtC,uBAAiB,SAASC;AAAA,IAC3B;AAAA,EACD;AACD,CAAC;;;AC7LD,IAAM,iBAAiB;AACvB,IAAM,YAAY,KAAK;AAMvB,IAAqB,QAArB,MAA2B;AAAA;AAAA;AAAA;AAAA,EAI1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACb,SAAK,KAAK;AACV,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,KAAK;AACV,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAoB;AAC9B,QAAI,KAAK,SAAS;AACjB,YAAM,OAAO,KAAK,QAAQ,OAAO,cAAc;AAC/C,UAAI,MAAM;AACT,eAAO,KAAK,KAAM,YAAY,CAAE,KAAK;AAAA,MACtC;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAY,OAAqB;AAC3C,QAAI,CAAC,KAAK,SAAS;AAClB,WAAK,UAAU,CAAC;AAAA,IACjB;AACA,QAAI,OAAO,KAAK,QAAQ,OAAO,cAAc;AAC7C,QAAI,OAAO,SAAS,aAAa;AAChC,WAAK,QAAQ,OAAO,cAAc,IAAI,CAAC;AACvC,aAAO,KAAK,QAAQ,OAAO,cAAc;AAAA,IAC1C;AACA,SAAK,KAAM,YAAY,CAAE,IAAI;AAAA,EAC9B;AACD;;;ACpEA,IAAM,WAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAMA,SAAS,iBAAiB,QAAgB,SAAyB;AAClE,QAAM,QAAQ,OAAO,MAAM,OAAO;AAClC,MAAI,CAAC,OAAO;AACX,UAAM,IAAI;AAAA,MACT,GAAG,0BAA0B,OAAO,EAAY,eAAe,MAAM;AAAA,IACtE;AAAA,EACD;AAEA,SAAO,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7B;AAQA,SAAS,cAAc,QAA2B;AACjD,QAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,QAAI,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI;AAC3B,aAAO,OAAO,KAAK,CAAC,CAAC;AAAA,IACtB;AAAA,EACD;AACA,SAAO;AACR;AAOA,SAAS,iBAAiB,QAAa;AACtC,QAAM,gBAAgB,IAAI,WAAW,CAAC;AACtC,MAAI,QAAQ,OAAO,aAAa;AAChC,MAAI,CAAC,OAAO;AACX,YAAQ,IAAI,MAAM;AAClB,UAAM,KAAK;AACX,UAAM,aAAa,cAAc,MAAM;AACvC,UAAM,WAAW,eAAe,OAAO,WAAW,WAAW;AAC7D,WAAO,aAAa,IAAI;AAAA,EACzB;AACD;AAEA,IAAqB,iBAArB,MAAoC;AAAA,EACnC,SAAiB;AAAA,EACjB,WAAmB;AAAA,EACnB,YAAoB;AAAA,EACpB,UAAkB;AAAA,EAClB,aAAqB;AAAA,EACrB,YAAoB;AAAA,EACpB,UAAkB;AAAA,EAClB,SAAmC,CAAC;AAAA,EAEpC,YAAYC,OAAc;AACzB,SAAK,MAAMA,KAAI;AAAA,EAChB;AAAA,EAEA,MAAM,UAAkB;AACvB,QAAI,CAAC,UAAU;AACd,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,UAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,UAAM,UAAU,SAAS,MAAM,0BAA0B;AACzD,QAAI,CAAC,SAAS;AACb,YAAM,IAAI,MAAM,iCAAiC;AAAA,IAClD;AACA,UAAM,gBAAgB,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG;AAExD,SAAK,SAAS,WAAW,cAAc,CAAC,CAAC;AACzC,SAAK,UAAU,WAAW,cAAc,CAAC,CAAC;AAC1C,SAAK,YAAY,WAAW,cAAc,CAAC,CAAC;AAC5C,SAAK,WAAW,WAAW,cAAc,CAAC,CAAC;AAC3C,SAAK,aAAa,WAAW,iBAAiB,MAAM,CAAC,GAAG,iBAAiB,CAAC;AAE1E,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,SAAS,CAAC;AAEf,UAAM,WAAW,WAAW,iBAAiB,MAAM,CAAC,GAAG,WAAW,CAAC;AACnE,UAAM,OAAO,KAAK,SAAS,KAAK;AAEhC,QAAI,QAAsB;AAE1B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,kBAAkB,KAAK,MAAM,OAAO;AAC1C,UAAI,CAAC,QAAQ,YAAY,KAAK,IAAI,GAAG;AACpC;AAAA,MACD;AACA,UAAI,aAAa,KAAK,IAAI,GAAG;AAC5B,cAAM,QAAQ,WAAW,gBAAgB,CAAC,CAAC;AAC3C,cAAM,SAAS,WAAW,gBAAgB,CAAC,CAAC;AAC5C,cAAM,SAAS,WAAW,gBAAgB,CAAC,CAAC;AAE5C,gBAAQ,KAAK,OAAO,KAAK;AACzB,YAAI,UAAU,QAAQ,OAAO,UAAU,aAAa;AACnD,gBAAM,WAAW,QAAQ,MAAM;AAAA,QAChC;AAAA,MACD,OAAO;AACN,gBAAQ,IAAI,MAAM;AAElB,cAAM,KAAK,WAAW,gBAAgB,CAAC,CAAC;AACxC,cAAM,KAAK;AACX,cAAM,IAAI,WAAW,gBAAgB,CAAC,CAAC;AACvC,cAAM,IAAI,WAAW,gBAAgB,CAAC,CAAC;AACvC,cAAM,QAAQ,WAAW,gBAAgB,CAAC,CAAC;AAC3C,cAAM,SAAS,WAAW,gBAAgB,EAAE,CAAC;AAC7C,cAAM,UAAU,WAAW,gBAAgB,EAAE,CAAC;AAC9C,cAAM,UAAU,WAAW,gBAAgB,EAAE,CAAC;AAC9C,cAAM,WAAW,WAAW,gBAAgB,EAAE,CAAC;AAE/C,YAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,GAAG;AACxC,eAAK,UAAU,KAAK,IAAI,WAAW,MAAM,SAAS,KAAK,OAAO;AAAA,QAC/D;AAEA,aAAK,OAAO,EAAE,IAAI;AAAA,MACnB;AAAA,IACD;AAEA,SAAK,WAAW,KAAK;AAErB,qBAAiB,KAAK,MAAM;AAE5B,QAAI,WAAyB;AAC7B,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACzC,YAAM,UAAU,SAAS,CAAC;AAC1B,iBAAW,KAAK,OAAO,QAAQ,WAAW,CAAC,CAAC;AAC5C,UAAI,UAAU;AACb;AAAA,MACD;AAAA,IACD;AACA,QAAI,CAAC,UAAU;AACd,iBAAW,YAAY,KAAK,QAAQ;AACnC,YAAI,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChE,kBAAQ,KAAK,OAAO,QAAQ;AAC5B,cAAI,MAAM,WAAW,KAAK,MAAM,UAAU,GAAG;AAC5C;AAAA,UACD;AACA,eAAK,YAAY,KAAK,IAAI,KAAK,WAAW,MAAM,MAAM;AAAA,QACvD;AAAA,MACD;AAAA,IACD,OAAO;AACN,WAAK,YAAY,SAAS;AAAA,IAC3B;AACA,SAAK,aAAa;AAAA,EACnB;AACD;AAEO,IAAM,qBAAqB,WAGhC,CAAC,aAAqB;AACvB,QAAM,WAAW,IAAI,eAAe,QAAQ;AAE5C,SAAO;AAAA,IACN;AAAA,IACA,MAAMC,WAAU;AACf,eAAS,MAAMA,SAAQ;AAAA,IACxB;AAAA,EACD;AACD,CAAC;;;AC7JM,IAAM,SAAS;AAAA,EACrB,QAAQ;AAAA,IACP,MAAM,CAAC,MAAc;AACpB,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,WAAW;AAAA,IACV,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,KAAK,IAAI;AAAA,IACjB;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,MAAM,IAAI;AAAA,MAClB;AACA,aAAO,QAAQ,EAAE,KAAK,IAAI,KAAK;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,IAAI;AAAA,IAChB;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,EAAE,IAAI,IAAI,IAAI;AAAA,IACtB;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,MAAM,IAAI,IAAI;AAAA,MACtB;AACA,aAAO,QAAQ,KAAK,KAAK,IAAI,IAAI;AAAA,IAClC;AAAA,EACD;AAAA,EAEA,SAAS;AAAA,IACR,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,IAAI,IAAI;AAAA,IACpB;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,IAAI,EAAE,IAAI,IAAI,IAAI;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,MAAM,IAAI,IAAI,IAAI;AAAA,MAC1B;AACA,aAAO,SAAS,KAAK,KAAK,IAAI,IAAI,IAAI;AAAA,IACvC;AAAA,EACD;AAAA,EAEA,SAAS;AAAA,IACR,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,IAAI,IAAI,IAAI;AAAA,IACxB;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,IAC9B;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,MAAM,IAAI,IAAI,IAAI,IAAI;AAAA,MAC9B;AACA,aAAO,QAAQ,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI;AAAA,IAC1C;AAAA,EACD;AAAA,EAEA,YAAY;AAAA,IACX,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,KAAK,IAAK,IAAI,KAAK,KAAM,CAAC;AAAA,IACtC;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,KAAK,IAAK,IAAI,KAAK,KAAM,CAAC;AAAA,IAClC;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,aAAO,OAAO,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,IACvC;AAAA,EACD;AAAA,EAEA,aAAa;AAAA,IACZ,IAAI,CAAC,MAAc;AAClB,aAAO,MAAM,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,IAC7C;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAAA,MAClC;AACA,aAAO,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,UAAU;AAAA,IACT,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,IAC/B;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,aAAO,KAAK,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,IAC7B;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,QAAQ,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI;AAAA,MACvC;AACA,aAAO,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,SAAS;AAAA,IACR,IAAI,CAAC,MAAc;AAClB,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,aAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;AAAA,IACrE;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,aAAO,KAAK,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,IAAI;AAAA,IACnE;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,UAAI,MAAM,GAAG;AACZ,eAAO;AAAA,MACR;AACA,WAAK;AACL,UAAI,IAAI,GAAG;AACV,eACC,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;AAAA,MAErE;AACA,aACC,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,IAAI;AAAA,IAEzE;AAAA,EACD;AAAA,EAEA,MAAM;AAAA,IACL,IAAI,CAAC,MAAc;AAClB,YAAM,IAAI;AACV,aAAO,IAAI,MAAM,IAAI,KAAK,IAAI;AAAA,IAC/B;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,YAAM,IAAI;AACV,aAAO,EAAE,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,IACtC;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,YAAM,IAAI,UAAU;AACpB,WAAK,KAAK,KAAK,GAAG;AACjB,eAAO,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI;AAAA,MACtC;AACA,aAAO,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,IAClD;AAAA,EACD;AAAA,EAEA,QAAQ;AAAA,IACP,IAAI,CAAC,MAAc;AAClB,aAAO,IAAI,OAAO,OAAO,IAAI,IAAI,CAAC;AAAA,IACnC;AAAA,IACA,KAAK,CAAC,MAAc;AACnB,UAAI,IAAI,IAAI,MAAM;AACjB,eAAO,SAAS,IAAI;AAAA,MACrB,WAAW,IAAI,IAAI,MAAM;AACxB,eAAO,UAAU,KAAK,MAAM,QAAQ,IAAI;AAAA,MACzC,WAAW,IAAI,MAAM,MAAM;AAC1B,eAAO,UAAU,KAAK,OAAO,QAAQ,IAAI;AAAA,MAC1C,OAAO;AACN,eAAO,UAAU,KAAK,QAAQ,QAAQ,IAAI;AAAA,MAC3C;AAAA,IACD;AAAA,IACA,OAAO,CAAC,MAAc;AACrB,UAAI,IAAI,KAAK;AACZ,eAAO,OAAO,OAAO,GAAG,IAAI,CAAC,IAAI;AAAA,MAClC;AACA,aAAO,OAAO,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;AAAA,IAC7C;AAAA,EACD;AACD;;;ACxOA,IAAM,SAAS,CAAC,IAAY,IAAY,MAAc;AACrD,UAAQ,KAAK,MAAM,IAAI;AACxB;AAEA,IAAM,iBAAiB,CAAC,CAAC;AAEzB,IAAM,YAAY,CAAC,MAAc;AAChC,MAAI,eAAe,CAAC,GAAG;AACtB,WAAO,eAAe,CAAC;AAAA,EACxB;AACA,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,SAAK;AAAA,EACN;AACA,iBAAe,CAAC,IAAI;AACpB,SAAO;AACR;AAEA,IAAM,YAAY,CAAC,GAAW,MAAc;AAC3C,SAAO,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;AACrD;AAEA,IAAM,aAAa,CAClB,IACA,IACA,IACA,IACA,MACI;AACJ,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,UACE,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,MAC7B,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,KACnC,KAAK,IACL;AAEF;AAIO,IAAM,gBAAgB;AAAA,EAC5B,QAAQ,CAAC,GAAa,MAAc;AACnC,UAAM,IAAI,EAAE,SAAS;AACrB,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,KAAK,MAAM,CAAC;AAEtB,QAAI,IAAI,GAAG;AACV,aAAO,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;AAAA,IAC5B;AACA,QAAI,IAAI,GAAG;AACV,aAAO,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAAA,IACpC;AAEA,WAAO,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AAAA,EACpD;AAAA,EACA,QAAQ,CAAC,GAAa,MAAc;AACnC,QAAI,IAAI;AACR,UAAM,IAAI,EAAE,SAAS;AAErB,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC5B,WAAK,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,GAAG,CAAC;AAAA,IACrE;AAEA,WAAO;AAAA,EACR;AAAA,EACA,YAAY,CAAC,GAAa,MAAc;AACvC,UAAM,IAAI,EAAE,SAAS;AACrB,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,KAAK,MAAM,CAAC;AAEpB,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG;AAClB,UAAI,IAAI,GAAG;AACV,YAAI,KAAK,MAAO,IAAI,KAAK,IAAI,EAAG;AAAA,MACjC;AAEA,aAAO;AAAA,QACN,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,QACjB,EAAE,CAAC;AAAA,QACH,GAAG,IAAI,KAAK,CAAC;AAAA,QACb,GAAG,IAAI,KAAK,CAAC;AAAA,QACb,IAAI;AAAA,MACL;AAAA,IACD,OAAO;AACN,UAAI,IAAI,GAAG;AACV,eAAO,EAAE,CAAC,KAAK,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,MAC5D;AACA,UAAI,IAAI,GAAG;AACV,eACC,EAAE,CAAC,KAAK,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAAA,MAEjE;AAEA,aAAO;AAAA,QACN,EAAE,IAAI,IAAI,IAAI,CAAC;AAAA,QACf,EAAE,CAAC;AAAA,QACH,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,QACvB,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,QACvB,IAAI;AAAA,MACL;AAAA,IACD;AAAA,EACD;AACD;;;AC7EA,IAAqB,QAArB,MAA2B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,YAAY,QAAgB;AAC3B,SAAK,cAAc,MAAM;AAEzB,SAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAgB;AAC5B,SAAK,cAAc,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAgB;AAC7B,SAAK,UAAU;AACf,SAAK,eAAe,CAAC;AACrB,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB,CAAC;AAC3B,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,kBAAkB,OAAO,OAAO;AACrC,SAAK,yBAAyB,cAAc;AAC5C,SAAK,iBAAiB,CAAC;AACvB,SAAK,mBAAmB;AACxB,SAAK,wBAAwB;AAC7B,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAE3B,SAAK,oBAAoB,KAAK;AAG9B,SAAK,eAAe;AAEpB,SAAK,mBAAmB;AAExB,SAAK,eAAe;AAGpB,eAAW,SAAS,QAAQ;AAC3B,UAAI,OAAO,WAAW,UAAU;AAC/B,aAAK,aAAa,KAAK,IAAI,WAAW,OAAO,KAAK,CAAC;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAiB;AAChC,QAAI,KAAK,YAAY;AACpB,WAAK,cAAc;AAAA,IACpB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AACjB,iBAAa,YAAY,cAAc,KAAK,oBAAoB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB;AACnB,iBAAa,eAAe,cAAc,KAAK,oBAAoB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,GACC,YACA,SASC;AACD,SAAK,aAAa;AAElB,QAAI,OAAO,YAAY,aAAa;AACnC,UAAI,QAAQ,UAAU;AACrB,aAAK,YAAY,QAAQ;AAAA,MAC1B;AACA,UAAI,QAAQ,MAAM;AACjB,aAAK,KAAK,QAAQ,IAAI;AAAA,MACvB;AACA,UAAI,QAAQ,QAAQ;AACnB,aAAK,OAAO,QAAQ,MAAM;AAAA,MAC3B;AACA,UAAI,QAAQ,QAAQ;AACnB,aAAK,OAAO,QAAQ,MAAM;AAAA,MAC3B;AACA,UAAI,QAAQ,OAAO;AAClB,aAAK,MAAM,QAAQ,KAAK;AAAA,MACzB;AACA,UAAI,QAAQ,eAAe;AAC1B,aAAK,cAAc,QAAQ,aAAa;AAAA,MACzC;AACA,UAAI,QAAQ,WAAW;AACtB,aAAK,MAAM;AAAA,MACZ;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,cAAM,QAAQ,GAAG;AAC7B,SAAK,wBAAwB;AAG7B,SAAK,MAAM,SAAS,IAAI;AAExB,SAAK,aAAa,OAAO,KAAK;AAE9B,eAAW,YAAY,KAAK,YAAY;AACvC,YAAM,WAAW,KAAK,WAAW,QAAQ;AAEzC,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC5B,YAAI,SAAS,WAAW,GAAG;AAC1B;AAAA,QACD;AAGA,aAAK,WAAW,QAAQ,IAAI;AAAA,UAC1B,KAAK,QAAoC,QAAQ;AAAA,QACnD,EAAE,OAAO,QAAQ;AAAA,MAClB;AAEA,WAAK,aAAa,QAAQ,IAAK,KAAK,QACnC,QACD;AAEA,UAAI,CAAC,MAAM,QAAQ,KAAK,aAAa,QAAQ,CAAC,GAAG;AAChD,QAAC,KAAK,aAAa,QAAQ,KAAgB;AAAA,MAC5C;AAEA,WAAK,mBAAmB,QAAQ,IAAI,KAAK,aAAa,QAAQ,KAAK;AAAA,IACpE;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AAEN,SAAK,MAAM,eAAe,IAAI;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAgB;AACrB,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAe;AACrB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,MAAe;AACnB,SAAK,QAAQ;AACb,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAwB;AAC9B,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,eAAsC;AACnD,SAAK,yBAAyB;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,QAAiB;AACzB,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,iBAA0C;AACjD,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,kBAA4C;AACpD,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,oBAAgD;AAC1D,SAAK,sBAAsB;AAC3B,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,OAAO,IAAY;AAGlB,SAAK,oBACJ,KAAK,aAAa,KAAK,oBACpB,KAAK,aACL,KAAK,oBAAoB;AAC7B,UAAM,OAAO,KAAK;AAElB,QAAI,KAAK,eAAe,QAAQ,OAAO,KAAK,YAAY;AACvD,aAAO;AAAA,IACR;AAEA,QAAI,CAAC,KAAK,uBAAuB;AAChC,UAAI,KAAK,qBAAqB,MAAM;AACnC,aAAK,iBAAiB,KAAK,KAAK,OAAO;AAAA,MACxC;AAEA,WAAK,wBAAwB;AAAA,IAC9B;AAEA,QAAI,WAAW,OAAO,KAAK,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,IAAI;AAE5B,UAAM,QAAQ,KAAK,gBAAgB,OAAO;AAE1C,eAAW,YAAY,KAAK,YAAY;AACvC,YAAM,QAAQ,KAAK,aAAa,QAAQ,KAAK;AAC7C,UAAI,MAAM,KAAK,WAAW,QAAQ;AAElC,UAAI,MAAM,QAAQ,GAAG,GAAG;AAEvB,aAAK,QAAQ,QAAQ,IAAI,KAAK,uBAAuB,KAAK,KAAK;AAAA,MAChE,OAAO;AAEN,YAAI,OAAO,QAAQ,UAAU;AAG5B,gBAAM,QAAQ,WAAW,GAAG;AAAA,QAC7B;AAGA,YAAI,OAAO,QAAQ,UAAU;AAG5B,eAAK,QAAQ,QAAQ,IAAI,SAAS,MAAM,SAAS;AAAA,QAClD;AAAA,MACD;AAAA,IACD;AAEA,QAAI,KAAK,sBAAsB,MAAM;AACpC,WAAK,kBAAkB,KAAK,KAAK,SAAS,KAAK;AAAA,IAChD;AAEA,QAAI,YAAY,GAAG;AAClB,UAAI,KAAK,UAAU,GAAG;AACrB,YAAI,SAAS,KAAK,OAAO,GAAG;AAC3B,eAAK;AAAA,QACN;AAGA,mBAAW,YAAY,KAAK,oBAAoB;AAC/C,cAAI,OAAO,KAAK,WAAW,QAAQ,MAAM,UAAU;AAClD,iBAAK,mBAAmB,QAAQ;AAAA;AAAA,YAG/B,KAAK,mBAAmB,QAAQ;AAAA,YAEhC,WAAW,KAAK,WAAW,QAAQ,CAAC;AAAA,UACtC;AAEA,cAAI,KAAK,OAAO;AACf,kBAAM,MAAM,KAAK,mBAAmB,QAAQ;AAC5C,iBAAK,mBAAmB,QAAQ,IAAI,KAAK,WAAW,QAAQ;AAC5D,iBAAK,WAAW,QAAQ,IAAI;AAAA,UAC7B;AACA,eAAK,aAAa,QAAQ,IAAI,KAAK,mBAAmB,QAAQ;AAAA,QAC/D;AAEA,YAAI,KAAK,OAAO;AACf,eAAK,YAAY,CAAC,KAAK;AAAA,QACxB;AAEA,aAAK,aAAa,OAAO,KAAK;AAE9B,eAAO;AAAA,MACR,OAAO;AAEN,aAAK,MAAM,eAAe,IAAI;AAE9B,YAAI,KAAK,wBAAwB,MAAM;AACtC,eAAK,oBAAoB,KAAK,KAAK,OAAO;AAAA,QAC3C;AAEA,iBACK,IAAI,GAAG,mBAAmB,KAAK,eAAe,QAClD,IAAI,kBACJ,KACC;AACD,eAAK,eAAe,CAAC,EAAE,MAAM,IAAI;AAAA,QAClC;AAEA,eAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,WAAW,SAAS;AACnB,WAAO;AAAA,EACR;AAAA,EACA,WAAW,gBAAgB;AAC1B,WAAO;AAAA,EACR;AACD;AAEO,IAAM,YAAY,WAAW,CAAC,QAAgB;AACpD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAE3B,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,MAAa;AAClB,YAAM,cAAcA,IAAG;AAAA,IACxB;AAAA,EACD;AACD,CAAC;;;ACjcD,aAAa,YAAY,YAAY;AACrC,aAAa,YAAY,YAAY;AACrC,aAAa,SAAS,SAAS;AAC/B,aAAa,YAAY,YAAY;AACrC,aAAa,YAAY,YAAY;AACrC,aAAa,UAAU,UAAU;AACjC,aAAa,SAAS,SAAS;AAC/B,aAAa,WAAW,WAAW;AACnC,aAAa,QAAQ,QAAQ;AAC7B,aAAa,aAAa,QAAQ;AAClC,aAAa,oBAAoB,oBAAoB;AACrD,aAAa,WAAW,WAAW;AACnC,aAAa,SAAS,SAAS;AAC/B,aAAa,kBAAkB,kBAAkB;AAyB1C,IAAM,UAAU,CAAoB,QAAuB;AACjE,SAAO,mBAAmB,EAAE,GAAG;AAChC;AAEO,IAAM,mBAAmB,MAAc;AAC7C,QAAMC,SAAQ,mBAAmB;AACjC,MAAI,YAAY;AAChB,aAAW,OAAOA,QAAO;AACxB,iBAAaA,OAAM,GAAG,EAAE,KAAK;AAAA,EAC9B;AACA,SAAO;AACR;;;ACtDA,IAAM,aAAN,MAAiB;AAAA,EAChB,cAAc;AACb,SAAK,cAAc,CAAC;AACpB,SAAK,mBAAmB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,SAAS,WAAW,UAAU,YAAY,OAAO;AAChD,QAAI,OAAO,aAAa,aAAa;AACpC,WAAK,YAAY,SAAS,IAAI;AAAA,QAC7B,OAAO;AAAA,QACP,MAAM,YAAY,CAAC,IAAI;AAAA,MACxB;AAAA,IACD,OAAO;AACN,YAAM,IAAI;AAAA,QACT,6BAA6B,YAAY;AAAA,MAC1C;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,KAAK,SAAS,MAAM;AACnB,UAAM,YAAY,KAAK,YAAY,IAAI;AACvC,QAAI,WAAW;AACd,YAAM,QAAQ,UAAU,OAAO;AAC/B,YAAM,YAAY,UAAU;AAC5B,UAAI;AAEJ,UAAI,cAAc,MAAM,UAAU,IAAI,IAAI;AAEzC,YAAI,aAAa,MAAM,KAAK,IAAI;AAChC,aAAK;AAAA,MACN,OAAO;AAEN,cAAM,KAAK,MAAM,KAAK,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AACtD,YAAI,WAAW;AACd,cAAI,YAAY;AAAA,QACjB;AAAA,MACD;AACA,aAAO;AAAA,IACR;AACA,UAAM,IAAI,MAAM,wCAAwC,OAAO,GAAG;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ;AACP,eAAW,aAAa,KAAK,aAAa;AACzC,UAAI,KAAK,YAAY,SAAS,GAAG;AAChC,aAAK,YAAY,SAAS,EAAE,OAAO,CAAC;AAAA,MACrC;AAAA,IACD;AACA,SAAK,mBAAmB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,KAAK,eAAe,MAAM;AAC9B,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACxB,UAAI,iBAAiB,MAAM;AAC1B,cAAM,IAAI,MAAM,qBAAqB,MAAM,qBAAqB;AAAA,MACjE,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD;AAGA,SAAK,YAAY,IAAI,SAAS,EAAE,KAAK,KAAK,GAAG;AAC7C,SAAK;AAEL,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAM;AACZ,WAAO,QAAQ,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,KAAK;AACb,UAAM,YAAY,IAAI;AACtB,WACC,OAAO,cAAc,eACrB,OAAO,IAAI,iBAAiB,cAC5B,aAAa,KAAK,eAClB,OAAO,KAAK,YAAY,SAAS,EAAE,SAAS;AAAA,EAE9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB;AAClB,WAAO,KAAK,mBAAmB,iBAAiB;AAAA,EACjD;AACD;AAiBA,IAAM,OAAO,IAAI,WAAW;AAE5B,IAAO,sBAAQ;;;ACnLR,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUxB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiDV,OAAO;AAAA;AAAA,IAEN,WAAW;AAAA,IACX,eAAe,KAAK;AAAA,IACpB,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,oBAAoB,KAAK;AAAA,IACzB,eAAe,KAAK;AAAA;AAAA,IACpB,mBAAmB,KAAK;AAAA;AAAA,IACxB,aAAa,KAAK;AAAA;AAAA,IAClB,MAAM,KAAK;AAAA;AAAA,IACX,YAAY;AAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,QAAQ,MAAM,QAAQ;AACrB,WAAO,KAAK,MAAM,SAAS,QAAQ,MAAM,MAAM;AAAA,EAChD;AACD;;;ACnGA,IAAqB,OAArB,MAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,YAAY,UAAU,QAAQ,cAAc;AAQ3C,SAAK,WAAW;AAEhB,QAAI,OAAO,KAAK,WAAW,aAAa;AAMvC,WAAK,SAAS,WAAW,IAAI;AAAA,IAC9B;AAEA,QAAI,OAAO,KAAK,WAAW,aAAa;AAMvC,WAAK,SAAS,CAAC;AAAA,IAChB;AAUA,SAAK,gBAAgB,UAAU,MAAM;AAYrC,SAAK,gBAAgB,UAAU,MAAM;AAErC,QAAI,OAAO,KAAK,QAAQ,aAAa;AASpC,WAAK,MAAM,aAAa,IAAI;AAAA,IAC7B;AACA,SAAK,IAAI,IAAI,GAAG,CAAC;AAEjB,QAAI,OAAO,KAAK,UAAU,aAAa;AAuBtC,WAAK,QAAQ,aAAa,IAAI;AAAA,IAC/B;AACA,SAAK,MAAM,IAAI,GAAG,CAAC;AAEnB,QAAI,OAAO,KAAK,aAAa,aAAa;AAOzC,WAAK,WAAW,aAAa,IAAI;AAAA,IAClC;AACA,SAAK,SAAS,IAAI,GAAG,CAAC;AAStB,SAAK,SAAS;AAQd,SAAK,OAAO;AAEZ,QAAI,OAAO,KAAK,WAAW,aAAa;AAOvC,WAAK,SAAS,aAAa,IAAI;AAAA,IAChC;AAEA,SAAK,OAAO,IAAI,KAAK,GAAG;AAUxB,SAAK,WAAW;AAShB,SAAK,eAAe;AASpB,SAAK,gBAAgB;AAWrB,SAAK,UAAU;AAUf,SAAK,UAAU;AAEf,QAAI,OAAO,iBAAiB,YAAY;AACvC,WAAK,eAAe;AAAA,IACrB;AAEA,SAAK,OAAO,MAAM;AAGlB,QAAI,OAAO,WAAW,aAAa;AAClC,UAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,eAAK,SAAS,OAAO,CAAC,CAAC;AAAA,QACxB;AAAA,MACD,OAAO;AACN,aAAK,SAAS,MAAM;AAAA,MACrB;AAAA,IACD;AAGA,SAAK,SAAS,cAAc;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,WAAW,MAAM;AAC1B,SAAK,WAAW,aAAa;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,OAAO;AACf,QAAI,iBAAiB,QAAQ,iBAAiB,QAAQ;AACrD,YAAM,OAAO,MAAM,UAAU;AAC7B,WAAK,OAAO,KAAK,IAAI;AAErB,WAAK,OAAO,IAAI,KAAK,MAAM;AAC3B,WAAK,OAAO,UAAU,KAAK,GAAG;AAAA,IAC/B,WAAW,iBAAiB,SAAS;AACpC,UAAI,CAAC,KAAK,OAAO,SAAS,KAAK,GAAG;AAEjC,aAAK,OAAO,KAAK,KAAK;AAAA,MACvB;AAEA,WAAK,OAAO,UAAU,MAAM,UAAU,CAAC;AAEvC,WAAK,OAAO,UAAU,MAAM,UAAU,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;AAAA,IAC/D,WAAW,iBAAiB,SAAS;AACpC,UAAI,CAAC,KAAK,OAAO,SAAS,KAAK,GAAG;AAEjC,aAAK,OAAO,KAAK,KAAK;AAAA,MACvB;AAEA,WAAK,OAAO,IAAI,MAAM,MAAM;AAC5B,WAAK,OAAO,UAAU,MAAM,GAAG;AAAA,IAChC,WAAW,iBAAiB,OAAO;AAClC,UAAI,CAAC,KAAK,OAAO,SAAS,KAAK,GAAG;AAEjC,aAAK,OAAO,KAAK,KAAK;AAAA,MACvB;AACA,WAAK,OAAO,SAAS,KAAK;AAAA,IAC3B,OAAO;AAEN,WAAK,SAAS,KAAK;AAAA,IACpB;AAEA,QAAI,OAAO,KAAK,iBAAiB,YAAY;AAC5C,WAAK,aAAa,IAAI;AAAA,IACvB;AAGA,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,UAAU,QAAQ,GAAG,QAAQ,MAAM;AAC9C,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,QAAI,mBAAmB,SAAS;AAC/B,cAAQ,SAAS,GAAG,GAAG,QAAQ;AAAA,IAChC,OAAO;AAEN,WAAK,OAAO,KAAK,IAAI,YAAY,IAAI,GAAG,GAAG,QAAQ;AAAA,IACpD;AAGA,SAAK,OAAO,IAAI,KAAK,OAAO,KAAK,EAAE,QAAQ,KAAK;AAEhD,QAAI,OAAO,KAAK,iBAAiB,YAAY;AAC5C,WAAK,aAAa,IAAI;AAAA,IACvB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,UAAU,QAAQ,GAAG;AAChC,SAAK,YAAY,UAAU,OAAO,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAS,MAAM,IAAI;AAClB,QAAIC,QAAO;AAEX,QAAI,OAAO,OAAO,aAAa;AAC9B,MAAAA,QAAO,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,OAAOA,UAAS,aAAa;AAChC,YAAM,IAAI;AAAA,QACT,iBAAiB,KAAK;AAAA,MACvB;AAAA,IACD;AAEA,QAAIA,MAAK,QAAQ;AAEhB,eAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AACrC,aAAK,YAAYA,MAAK,CAAC,EAAE,OAAO,CAAC;AAAA,MAClC;AAGA,WAAK,OAAOA,MAAK,CAAC,EAAE,WAAW;AAC/B,WAAK,SAAS,IAAIA,MAAK,CAAC,EAAE,YAAY,GAAGA,MAAK,CAAC,EAAE,YAAY,CAAC;AAC9D,WAAK,SAASA,MAAK,CAAC,EAAE,UAAU;AAAA,IACjC;AAGA,WAAOA,MAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAO;AACf,WAAO,KAAK,OAAO,SAAS,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAO;AAElB,SAAK,OAAO,MAAM;AAElB,WAAO,KAAK,QAAQ,KAAK;AAEzB,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC5C,WAAK,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,IAC7B;AAEA,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,OAAO;AACpB,WAAO,KAAK,YAAY,KAAK,SAAS,KAAK,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,iBAAiB,UAAU,UAAU,MAAM,YAAY;AACtD,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,MAAM;AACtB,QAAI,OAAO,SAAS,aAAa;AAChC,UAAI,OAAO,SAAS,UAAU;AAC7B,YAAI,OAAO,UAAU,MAAM,IAAI,MAAM,aAAa;AACjD,eAAK,gBAAgB,UAAU,MAAM,IAAI;AAAA,QAC1C,OAAO;AACN,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAC/D;AAAA,MACD,WAAW,OAAO,SAAS,UAAU;AACpC,aAAK,gBAAgB;AAAA,MACtB,OAAO;AACN,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAC/D;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,UAAU;AAE5B,UAAM,UAAU,SAAS;AACzB,UAAM,WAAW,SAAS;AAK1B,SAAK,SAAS,IAAI,IAAI,OAAO;AAG7B,UAAM,UAAU,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,IAAI,SAAS;AAChE,QAAI,UAAU,GAAG;AAChB,UAAI,KAAK,SAAS,GAAG;AAEpB,aAAK,IAAI,MAAM,IAAI,KAAK,UAAU,UAAU,SAAS;AACrD,aAAK,IAAI,MAAM,IAAI,KAAK,UAAU,UAAU,SAAS;AAAA,MACtD,OAAO;AAEN,aAAK,IAAI,KAAK,UAAU,SAAS;AACjC,aAAK,IAAI,KAAK,UAAU,SAAS;AAAA,MAClC;AAAA,IACD;AAEA,QAAI,QAAQ,MAAM,KAAK,CAAC,KAAK,eAAe;AAE3C,YAAM,MAAM,KAAK,YAAY,OAAO,IAAI,KAAK,YAAY,OAAO,KAAK;AACrE,WAAK,UAAU,QAAQ,KAAK;AAC5B,WAAK,UAAU,QAAQ,KAAK,CAAC;AAAA,IAC9B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQ,UAAU,SAAS;AAC1B,QAAI,IAAI;AACR,UAAM,SAAS,KAAK;AAEpB,UAAM,MAAM,OAAO;AAEnB,QAAI,OAAO,aAAa,YAAY;AACnC,YAAM,IAAI,MAAM,WAAW,oBAAoB;AAAA,IAChD;AAEA,WAAO,IAAI,KAAK;AACf,eAAS,KAAK,WAAW,MAAM,OAAO,CAAC,GAAG,GAAG,MAAM;AACnD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,YAAY,MAAM;AACjB,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,WAAW,GAAG;AAEtB,OAAC,IAAI,EAAE,IAAI;AAAA,IACZ,OAAO;AAEN,OAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;AAAA,IACjC;AAEA,QAAI,KAAK,UAAU,EAAE,SAAS,IAAI,EAAE,GAAG;AAEtC,eAAS,IAAI,KAAK,OAAO,QAAQ,OAAO,KAAM,QAAQ,KAAK,OAAO,CAAC,KAAM;AACxE,YAAI,MAAM,SAAS,IAAI,EAAE,GAAG;AAC3B,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAO,IAAI,KAAK,UAAU,EAAE,QAAQ;AAC1C,QAAI,UAAU,GAAG;AAChB,WAAK,OAAO,MAAM;AAClB,WAAK,QAAQ,CAAC,UAAU;AACvB,cAAM,OAAO,OAAO,CAAC;AACrB,aAAK,OAAO,UAAU,MAAM,UAAU,CAAC;AAAA,MAOxC,CAAC;AAAA,IAMF;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,GAAG,GAAG;AACpB,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAI,GAAG,IAAI,GAAG;AACzB,SAAK,SAAS,IAAI;AAClB,SAAK,SAAS,IAAI;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAAS;AAGR,UAAM;AAAA;AAAA,MAAuB,cAAM;AAAA;AAGnC,QAAI,KAAK,MAAM,MAAM,GAAG;AACvB,WAAK,IAAI,KAAK,KAAK,MAAM,IAAI;AAAA,IAC9B;AACA,QAAI,KAAK,MAAM,MAAM,GAAG;AACvB,WAAK,IAAI,KAAK,KAAK,MAAM,IAAI;AAAA,IAC9B;AAGA,QAAI,KAAK,SAAS,IAAI,GAAG;AACxB,YAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,YAAM,KAAK,KAAK,IAAI,IAAI;AACxB,YAAM,IAAI,KAAK,IAAI,IAAI;AAEvB,WAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,IACxC;AACA,QAAI,KAAK,SAAS,IAAI,GAAG;AACxB,YAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,YAAM,KAAK,KAAK,IAAI,IAAI;AACxB,YAAM,IAAI,KAAK,IAAI,IAAI;AAEvB,WAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,IACxC;AAGA,QAAI,KAAK,IAAI,MAAM,GAAG;AACrB,WAAK,IAAI,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,OAAO,GAAG,KAAK,OAAO,CAAC;AAAA,IAC7D;AACA,QAAI,KAAK,IAAI,MAAM,GAAG;AACrB,WAAK,IAAI,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,OAAO,GAAG,KAAK,OAAO,CAAC;AAAA,IAC7D;AAGA,SAAK,UAAU,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM,CAAC,IAAI;AACtD,SAAK,UAAU,KAAK,UAAU,QAAQ,KAAK;AAG3C,SAAK,SAAS,IAAI,IAAI,KAAK,GAAG;AAG9B,WAAO,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,eAAW,QAAQ,KAAK,MAAM;AAC9B,iBAAa,QAAQ,KAAK,GAAG;AAC7B,iBAAa,QAAQ,KAAK,KAAK;AAC/B,iBAAa,QAAQ,KAAK,QAAQ;AAClC,iBAAa,QAAQ,KAAK,MAAM;AAChC,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,UAAI,iBAAiB,OAAO;AAC3B,kBAAU,QAAQ,KAAK;AAAA,MACxB,WAAW,iBAAiB,MAAM;AACjC,iBAAS,QAAQ,KAAK;AAAA,MACvB,WAAW,iBAAiB,SAAS;AACpC,oBAAY,QAAQ,KAAK;AAAA,MAC1B,OAAO;AACN,4BAAK,KAAK,KAAK;AAAA,MAChB;AAAA,IACD,CAAC;AAGD,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,OAAO,SAAS;AAGrB,SAAK,UAAU,KAAK;AAAA,EACrB;AACD;;;AClsBO,SAAS,kBAAkB,IAAI,QAAQ;AAC7C,QAAM,aAAa,CAAC;AACpB,QAAM,SAAS;AACf,MAAI;AACJ,MAAI,IAAI;AAGR,SAAQ,QAAQ,OAAO,KAAK,OAAO,MAAM,GAAI;AAC5C,eAAW,MAAM,CAAC,CAAC,IAAI;AAAA,EACxB;AAEA,SAAO;AACR;;;ACVO,SAAS,aAAa,KAAK,WAAW;AAC5C,MAAI,IAAI,UAAU,GAAG,CAAC,MAAM,aAAa;AACxC,WAAO,eAAe,YAAY,YAAY;AAAA,EAC/C;AACA,SAAO;AACR;AAQO,SAAS,sBAAsB,IAAI;AACzC,MACC,GAAG,yBAAyB,GAAG,eAAe,GAAG,UAAU,EAAE,YAC5D,KACD,GAAG,yBAAyB,GAAG,iBAAiB,GAAG,UAAU,EAAE,YAAY,GAC1E;AACD,WAAO;AAAA,EACR;AACA,MACC,GAAG,yBAAyB,GAAG,eAAe,GAAG,YAAY,EAAE,YAC9D,KACD,GAAG,yBAAyB,GAAG,iBAAiB,GAAG,YAAY,EAAE,YAChE,GACA;AACD,WAAO;AAAA,EACR;AACA,SAAO;AACR;;;AChCA,SAAS,cAAc,IAAI,MAAM,QAAQ;AACxC,QAAM,SAAS,GAAG,aAAa,IAAI;AACnC,KAAG,aAAa,QAAQ,MAAM;AAC9B,KAAG,cAAc,MAAM;AAEvB,MAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;AACtD,UAAM,IAAI,MAAM,GAAG,iBAAiB,MAAM,CAAC;AAAA,EAC5C;AAEA,SAAO;AACR;AAMO,SAAS,eAAe,IAAI,QAAQ,UAAU,YAAY;AAChE,QAAM,aAAa,cAAc,IAAI,GAAG,eAAe,MAAM;AAC7D,QAAM,aAAa,cAAc,IAAI,GAAG,iBAAiB,QAAQ;AAEjE,MAAI,UAAU,GAAG,cAAc;AAE/B,KAAG,aAAa,SAAS,UAAU;AACnC,KAAG,aAAa,SAAS,UAAU;AAInC,aAAW,YAAY,YAAY;AAClC,OAAG,mBAAmB,SAAS,WAAW,QAAQ,GAAG,QAAQ;AAAA,EAC9D;AAEA,KAAG,YAAY,OAAO;AAEtB,MAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;AACrD,UAAM,YACL,+BACA,OACA,2BAEA,GAAG,oBAAoB,SAAS,GAAG,eAAe,IAClD,oBAEA,GAAG,SAAS,IACZ,6BAEA,GAAG,kBAAkB,OAAO;AAE7B,OAAG,cAAc,OAAO;AACxB,cAAU;AAEV,UAAM,IAAI,MAAM,SAAS;AAAA,EAC1B;AAEA,KAAG,WAAW,OAAO;AAGrB,KAAG,aAAa,UAAU;AAC1B,KAAG,aAAa,UAAU;AAE1B,SAAO;AACR;;;AC3DO,SAAS,OAAO,KAAK;AAE3B,QAAM,IAAI,QAAQ,wCAAwC,IAAI;AAE9D,QAAM,IAAI,QAAQ,sBAAsB,EAAE;AAE1C,QAAM,IAAI,QAAQ,eAAe,EAAE;AAEnC,QAAM,IAAI,QAAQ,0CAA0C,IAAI;AAEhE,SAAO;AACR;;;ACXA,IAAM,SAAS;AAAA,EACd,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AACZ;AAKO,SAAS,gBAAgB,IAAI,QAAQ;AAC3C,QAAM,WAAW,CAAC;AAClB,QAAM,QAAQ;AACd,QAAM,eAAe,CAAC;AACtB,QAAM,aAAa,CAAC;AACpB,QAAM,YAAY,CAAC;AACnB,MAAI;AAGJ,GAAC,OAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQ,CAACC,YAAW;AACpD,WAAQ,QAAQ,MAAM,KAAKA,OAAM,GAAI;AACpC,mBAAa,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;AAAA,IACjC;AAAA,EACD,CAAC;AAGD,SAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,SAAS;AAC3C,UAAM,OAAO,aAAa,IAAI;AAC9B,cAAU,IAAI,IAAI,GAAG,mBAAmB,OAAO,SAAS,IAAI;AAE5D,eAAW,IAAI,IAAI;AAAA,MAClB,KAAM,0BAAUC,OAAM;AAIrB,eAAO,WAAY;AAClB,iBAAO,UAAUA,KAAI;AAAA,QACtB;AAAA,MACD,GAAG,IAAI;AAAA,MACP,MAAM,SAAUA,OAAMC,OAAM,IAAI;AAC/B,YAAI,OAAO,KAAKA,KAAI,GAAG;AAItB,iBAAO,SAAU,KAAK;AACrB,eAAG,EAAE,EAAE,UAAUD,KAAI,GAAG,OAAO,GAAG;AAAA,UACnC;AAAA,QACD,OAAO;AAIN,iBAAO,SAAU,KAAK;AACrB,gBAAI,MAAM;AACV,gBAAI,IAAI,UAAU,KAAK,KAAK,EAAE,GAAG;AAChC,qBAAO;AAAA,YACR;AACA,eAAG,GAAG,EAAE,UAAUA,KAAI,GAAG,GAAG;AAAA,UAC7B;AAAA,QACD;AAAA,MACD,GAAG,MAAM,MAAM,YAAY,OAAO,IAAI,CAAC;AAAA,IACxC;AAAA,EACD,CAAC;AACD,SAAO,iBAAiB,UAAU,UAAU;AAE5C,SAAO;AACR;;;ACvEA,IAAqB,WAArB,MAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4B7B,YAAY,IAAI,QAAQ,UAAU,WAAW;AAK5C,SAAK,KAAK;AAMV,SAAK,SAAS;AAAA,MACb,OAAO,MAAM;AAAA,MACb,aAAa,sBAAsB,KAAK,EAAE;AAAA,IAC3C;AAMA,SAAK,WAAW;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,aAAa,sBAAsB,KAAK,EAAE;AAAA,IAC3C;AAMA,SAAK,aAAa,kBAAkB,KAAK,IAAI,IAAI;AAMjD,SAAK,UAAU;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAMA,SAAK,WAAW,gBAAgB,KAAK,IAAI,IAAI;AAG7C,iBAAa,YAAY,gBAAgB,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACN,SAAK,GAAG,WAAW,KAAK,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,MAAM;AACvB,UAAM,OAAO,KAAK,WAAW,IAAI;AACjC,QAAI,OAAO,SAAS,aAAa;AAChC,aAAO;AAAA,IACR,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,MAAM,OAAO;AACvB,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,IAAI,MAAM,aAAa;AAC1C,UAAI,OAAO,UAAU,YAAY,OAAO,MAAM,YAAY,YAAY;AACrE,iBAAS,IAAI,IAAI,MAAM,QAAQ;AAAA,MAChC,OAAO;AACN,iBAAS,IAAI,IAAI;AAAA,MAClB;AAAA,IACD,OAAO;AACN,YAAM,IAAI,MAAM,gBAAgB,OAAO,0BAA0B,IAAI;AAAA,IACtE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoB,IAAI,YAAY,gBAAgB;AAEnD,aAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,EAAE,OAAO;AACvD,YAAM,UAAU,WAAW,KAAK;AAChC,YAAM,WAAW,KAAK,kBAAkB,QAAQ,IAAI;AAEpD,UAAI,aAAa,IAAI;AACpB,WAAG,wBAAwB,QAAQ;AACnC,WAAG;AAAA,UACF;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ;AAAA,QACT;AAAA,MACD,OAAO;AACN,WAAG,yBAAyB,KAAK;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACT,SAAK,WAAW;AAChB,SAAK,aAAa;AAElB,SAAK,GAAG,cAAc,KAAK,OAAO;AAElC,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EACjB;AACD;;;AC5IA,IAAqB,aAArB,MAAqB,oBAAmB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,YAAY,GAAG,GAAG,OAAO,QAAQ;AAEhC,UAAM,GAAG,GAAG,OAAO,MAAM;AAOzB,SAAK,MAAM,IAAI,mBAAmB,GAAG,GAAG,GAAG,MAAM;AAChD,WAAK,aAAa;AAClB,WAAK,UAAU;AAAA,IAChB,CAAC;AAaD,SAAK,cAAc,IAAI,gBAAgB,KAAK,KAAK,MAAM;AACtD,WAAK,aAAa;AAClB,WAAK,UAAU;AAAA,IAChB,CAAC;AAED,QAAI,OAAO,KAAK,qBAAqB,aAAa;AAKjD,WAAK,mBAAmB,aAAa,IAAI;AAAA,IAC1C;AACA,SAAK,iBAAiB,SAAS;AAsC/B,SAAK,OAAO;AAQZ,SAAK,OAAO;AAaZ,SAAK,qBAAqB;AAO1B,SAAK,eAAe;AAOpB,SAAK,mBAAmB;AAOxB,SAAK,eAAe;AAQpB,SAAK,WAAW;AAmBhB,SAAK,gBAAgB;AAUrB,SAAK,QAAQ;AAOb,SAAK,WAAW;AAuBhB,SAAK,OAAO;AAOZ,SAAK,SAAS;AASd,SAAK,YAAY;AAOjB,SAAK,OAAO;AAMZ,SAAK,eAAe;AAOpB,SAAK,cAAc;AAOnB,SAAK,UAAU;AAMf,SAAK,UAAU;AAMf,SAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,IACJ;AAMA,SAAK,cAAc;AAMnB,SAAK,aAAa;AAMlB,SAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,KAAK,CAAG;AAG7C,SAAK,WAAW,CAAG;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,YAAY;AACf,QAAI,OAAO,KAAK,eAAe,aAAa;AAC3C,UACC,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,SAAS,oBAAoB,YACxC;AAED,aAAK,aAAa,KAAK,SAAS,gBAAgB,EAAE;AAAA,MACnD;AAAA,IACD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAa;AAChB,WACC,KAAK,aAAa,QACjB,OAAO,KAAK,aAAa,eACzB,KAAK,SAAS,eAAe;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,OAAO;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EACA,IAAI,KAAK,OAAO;AACf,SAAK,MAAM,KAAK,KAAK;AACrB,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA,EACA,IAAI,MAAM,OAAO;AAChB,SAAK,IAAI,IAAI;AACb,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAa;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EACA,IAAI,WAAW,OAAO;AACrB,QAAI,KAAK,gBAAgB,OAAO;AAC/B,WAAK,cAAc;AACnB,UAAI,OAAO,KAAK,uBAAuB,YAAY;AAClD,aAAK,mBAAmB,KAAK,MAAM,KAAK;AAAA,MACzC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,aAAa;AAChB,WAAO,KAAK,MAAM,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,aAAa;AAChB,WAAO,KAAK,MAAM,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,QAAI,OAAO,KAAK,YAAY,aAAa;AACxC,YAAM,UAAU;AAChB,UAAI,KAAK,SAAS,GAAG;AACpB,aAAK,aAAa;AAAA,MACnB,OAAO;AAEN,aAAK,QAAQ,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM;AAAA,MACvE;AAAA,IACD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWE,QAAO;AACjB,QAAI,OAAOA,WAAU,UAAU;AAC9B,WAAK,QAAQ,MAAMA,QAAO,GAAK,CAAG;AAElC,UAAI,MAAM,KAAK,KAAK,GAAG;AACtB,aAAK,QAAQ;AAAA,MACd;AACA,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,MAAM;AAClB,SAAK,MAAM,IAAI,CAAC,CAAC;AACjB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,MAAM;AAClB,SAAK,MAAM,IAAI,CAAC,CAAC;AACjB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,GAAG;AACZ,SAAK,iBAAiB,SAAS,CAAC;AAChC,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAQ;AACf,UAAM,IAAI,KAAK,UAAU;AACzB,QAAI;AACJ,QAAI;AAEJ,QAAI,kBAAkB,aAAY;AACjC,YAAM,IAAI,OAAO,UAAU;AAC3B,WAAK,EAAE,UAAU,EAAE;AACnB,WAAK,EAAE,UAAU,EAAE;AAAA,IACpB,OAAO;AAEN,WAAK,OAAO,IAAI,EAAE;AAClB,WAAK,OAAO,IAAI,EAAE;AAAA,IACnB;AAEA,WAAO,KAAK,MAAM,IAAI,EAAE;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAQ;AAClB,UAAM,IAAI,KAAK,UAAU;AACzB,QAAI;AACJ,QAAI;AAEJ,QAAI,kBAAkB,aAAY;AACjC,YAAM,IAAI,OAAO,UAAU;AAC3B,WAAK,EAAE,UAAU,EAAE;AACnB,WAAK,EAAE,UAAU,EAAE;AAAA,IACpB,OAAO;AAEN,WAAK,EAAE,UAAU,OAAO;AACxB,WAAK,EAAE,UAAU,OAAO;AAAA,IACzB;AAEA,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ;AACd,QAAIC;AAEJ,QAAI,kBAAkB,aAAY;AACjC,MAAAA,YAAW,OAAO;AAAA,IACnB,OAAO;AACN,MAAAA,YAAW;AAAA,IACZ;AAEA,UAAM,QAAQ,KAAK,QAAQA,SAAQ;AAEnC,SAAK,OAAO,KAAK;AAEjB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAO,GAAG;AAChB,QAAI,UAAU,GAAG;AAChB,WAAK,iBAAiB,OAAO,OAAO,CAAC;AACrC,WAAK,aAAa;AAClB,WAAK,UAAU;AAAA,IAChB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,GAAG,IAAI,GAAG;AACf,SAAK,iBAAiB,MAAM,GAAG,CAAC;AAChC,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG;AACT,SAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AACnB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI;AACV,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAAW,MAAM;AAC7B,QAAI,KAAK,cAAc;AACtB,YAAM,SAAS,KAAK,UAAU;AAE9B,aAAO,MAAM;AACb,UAAI,KAAK,kBAAkB,QAAQ,CAAC,KAAK,iBAAiB,WAAW,GAAG;AAEvE,aAAK,iBAAiB;AAAA,UACrB,CAAC,KAAK,QAAQ,KAAK,YAAY;AAAA,UAC/B,CAAC,KAAK,SAAS,KAAK,YAAY;AAAA,QACjC;AACA,eAAO,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,QAAQ,KAAK,gBAAgB;AACpE,aAAK,iBAAiB;AAAA,UACrB,KAAK,QAAQ,KAAK,YAAY;AAAA,UAC9B,KAAK,SAAS,KAAK,YAAY;AAAA,QAChC;AAAA,MACD,OAAO;AACN,eAAO,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAE7C,eAAO;AAAA,UACN,CAAC,KAAK,QAAQ,KAAK,YAAY;AAAA,UAC/B,CAAC,KAAK,SAAS,KAAK,YAAY;AAAA,QACjC;AAAA,MACD;AAEA,UAAI,aAAa,MAAM;AACtB,cAAM,SAAS,KAAK,oBAAoB;AACxC,eAAO;AAAA,UACN,OAAO,IAAI,OAAO,IAAI,OAAO,QAAQ;AAAA,UACrC,OAAO,IAAI,OAAO,IAAI,OAAO,SAAS;AAAA,QACvC;AAAA,MACD;AACA,aAAO;AAAA,IACR,OAAO;AAGN,aAAO,MAAM,aAAa,QAAQ;AAAA,IACnC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB;AACrB,QAAI,OAAO,KAAK,YAAY,aAAa;AACxC,WAAK,UAAU,aAAa,IAAI;AAAA,IACjC;AAEA,SAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACvC,QACC,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,SAAS,wBAAwB,cAC7C,KAAK,aAAa,MACjB;AACD,WAAK,QAAQ,IAAI,KAAK,SAAS,oBAAoB,CAAC;AAAA,IACrD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQC,WAAU;AACjB,UAAM,KAAK,KAAK,QAAQ,KAAK,YAAY;AACzC,UAAM,KAAK,KAAK,SAAS,KAAK,YAAY;AAG1C,IAAAA,UAAS,KAAK;AAGd,IAAAA,UAAS,eAAeA,UAAS,YAAY,IAAI,KAAK,WAAW,CAAC;AAGlE,QAAI,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG;AACjC,YAAM,KAAK,KAAK,MAAM,IAAI,KAAK,UAAU,KAAK;AAC9C,YAAM,KAAK,KAAK,MAAM,IAAI,KAAK,UAAU,KAAK;AAE9C,MAAAA,UAAS,UAAU,IAAI,EAAE;AACzB,MAAAA,UAAS,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC;AAC3D,MAAAA,UAAS,UAAU,CAAC,IAAI,CAAC,EAAE;AAAA,IAC5B;AAGA,QAAI,OAAO,KAAK,SAAS,aAAa;AACrC,MAAAA,UAAS,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACzC,MAAAA,UAAS,QAAQ,KAAK,IAAI;AAC1B,MAAAA,UAAS,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AAAA,IAC5C;AAGA,QAAI,OAAO,KAAK,WAAW,YAAY,OAAOA,UAAS,OAAO,aAAa;AAC1E,MAAAA,UAAS,eAAe,KAAK;AAAA,IAC9B;AAEA,QAAI,KAAK,kBAAkB,QAAQ,CAAC,KAAK,iBAAiB,WAAW,GAAG;AAEvE,MAAAA,UAAS,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACzC,MAAAA,UAAS,UAAU,KAAK,gBAAgB;AACxC,MAAAA,UAAS,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AAAA,IAC5C;AAGA,IAAAA,UAAS,UAAU,CAAC,IAAI,CAAC,EAAE;AAG3B,IAAAA,UAAS,QAAQ,KAAK,MAAM,KAAK,WAAW,CAAC;AAG7C,QAAI,KAAK,cAAcA,UAAS,aAAa,GAAG;AAC/C,MAAAA,UAAS,aAAa,KAAK,SAAS;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,KAAKA,WAAU,UAAU;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAASA,WAAU;AAElB,IAAAA,UAAS,UAAU;AAGnB,QAAI,OAAO,KAAK,SAAS,aAAa;AACrC,MAAAA,UAAS,UAAU;AAAA,IACpB;AAGA,QAAI,OAAO,KAAK,WAAW,YAAY,OAAOA,UAAS,OAAO,aAAa;AAC1E,MAAAA,UAAS,eAAe;AAAA,IAEzB;AAGA,IAAAA,UAAS,QAAQ;AAGjB,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,cAAc;AACb,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,iBAAa,QAAQ,KAAK,gBAAgB;AAC1C,SAAK,mBAAmB;AAExB,SAAK,YAAY,OAAO;AACxB,SAAK,cAAc;AAEnB,SAAK,MAAM;AAEX,QAAI,OAAO,KAAK,YAAY,aAAa;AACxC,mBAAa,QAAQ,KAAK,OAAO;AACjC,WAAK,UAAU;AAAA,IAChB;AAEA,QAAI,KAAK,mBAAmB,QAAQ;AACnC,iBAAW,QAAQ,KAAK,OAAO;AAC/B,WAAK,UAAU;AAAA,IAChB;AAEA,SAAK,qBAAqB;AAE1B,QAAI,OAAO,KAAK,SAAS,aAAa;AACrC,0BAAK,KAAK,KAAK,IAAI;AACnB,WAAK,OAAO;AAAA,IACb;AAEA,QAAI,KAAK,iBAAiB,OAAO;AAChC,gBAAU,QAAQ,KAAK,KAAK;AAC5B,WAAK,QAAQ;AAAA,IACd;AAIA,SAAK,WAAW;AAIhB,SAAK,aAAa;AAIlB,QAAI,KAAK,gBAAgB,MAAM;AAC9B,WAAK,KAAK,QAAQ,MAAM,KAAK,MAAM,SAAS;AAC5C,WAAK,OAAO;AAAA,IACb;AAGA,4BAAwB,IAAI;AAG5B,SAAK,eAAe,MAAM,MAAM,SAAS;AAGzC,QAAI,KAAK,kBAAkB,UAAU;AACpC,WAAK,OAAO,QAAQ;AACpB,WAAK,SAAS;AAAA,IACf;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAAA,EAEjB;AACD;;;AC71BA;AAAA;AAAA;AAAA,qBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAAC;AAAA,EAAA,iBAAAC;AAAA,EAAA;AAAA;;;ACMO,SAAS,QAAQ,YAAY,aAAaC,UAAS;AACzD,MAAI,wBAAwB,QAAQ;AACnC;AAAA,EACD;AACA,QAAM,MAAM;AACZ,QAAM,QAAQ,IAAI,MAAM,EAAE;AAE1B,MAAI,QAAQ,gBAAgB;AAC3B,YAAQ;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,IACD;AAAA,EACD,OAAO;AACN,YAAQ,KAAK,KAAK,YAAYA,UAAS,WAAW;AAAA,EACnD;AAEA,MAAI,OAAO,UAAU,aAAa;AACjC,YAAQ,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,QAAQ,gBAAgB;AAC3B,YAAQ,SAAS;AAAA,EAClB;AACD;;;AC3BO,IAAM,UAAU,CAAC;AAGjB,IAAM,UAAU,CAAC;AAGjB,IAAM,UAAU,CAAC;AAGjB,IAAM,WAAW,CAAC;AAGlB,IAAM,YAAY,CAAC;AAGnB,IAAM,WAAW,CAAC;;;ACJlB,SAAS,UAAU,KAAK,cAAc,WAAW,CAAC,GAAG;AAC3D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,UAAM,KAAK;AAAA,MACV,QAAQ;AAAA;AAAA,MAER,OAAO,SAAS,YAAY,KAAK,aAAa;AAAA,MAC9C,aAAa,SAAS,oBAAoB,OAAO,YAAY;AAAA;AAAA,MAE7D,MAAM,SAAS,gBAAgB,cAAc,SAAS;AAAA,IACvD,CAAC,EACC,KAAK,CAAC,aAAa;AACnB,UAAI,CAAC,SAAS,IAAI;AAEjB,YAAI,SAAS,WAAW,GAAG;AAC1B,cAAI,OAAO,YAAY,YAAY;AAClC;AAAA,cACC,IAAI;AAAA,gBACH;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,cAAQ,cAAc;AAAA,QACrB,KAAK;AACJ,iBAAO,SAAS,KAAK;AAAA,QACtB,KAAK;AACJ,iBAAO,SAAS,KAAK;AAAA,QACtB,KAAK;AACJ,iBAAO,SAAS,KAAK;AAAA,QACtB,KAAK;AACJ,iBAAO,SAAS,YAAY;AAAA,QAC7B;AACC,iBAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,MAC3C;AAAA,IACD,CAAC,EACA,KAAK,CAACC,UAAS;AACf,aAAO,QAAQA,KAAI;AAAA,IACpB,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,aAAO,OAAO,KAAK;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AACF;;;AChDO,SAAS,cAAcC,OAAMC,SAAQC,UAAS,UAAU;AAC9D,YAAUF,MAAK,KAAK,eAAe,QAAQ,EACzC,KAAK,CAAC,aAAa;AAEnB,UAAM,UAAU,IAAI,YAAY;AAChC,YAAQA,MAAK,IAAI,IAAI,QAAQ,OAAO,QAAQ;AAE5C,QAAI,OAAOC,YAAW,YAAY;AAEjC,MAAAA,QAAO;AAAA,IACR;AAAA,EACD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,QAAI,OAAOC,aAAY,YAAY;AAClC,MAAAA,SAAQ,KAAK;AAAA,IACd;AAAA,EACD,CAAC;AAEF,SAAO;AACR;;;AChBO,SAAS,gBAAgBC,OAAMC,SAAQC,UAAS;AACtD,QAAM,cACL,OAAO,WAAW,aAAa,cAC5B,WAAW,SAAS,QACpB;AAEJ,MAAI,UAAUF,MAAK,GAAG,MAAM,MAAM;AAEjC,QAAI,CAACA,MAAK,IAAI,WAAW,MAAM,GAAG;AACjC,MAAAA,MAAK,MAAM,SAASA,MAAK,MAAM;AAAA,IAChC;AAAA,EACD;AAEA,MAAI,OAAO,gBAAgB,aAAa;AAEvC,UAAM,OAAO,IAAI,SAASA,MAAK,MAAMA,MAAK,GAAG;AAE7C,SAAK,KAAK,EAAE;AAAA,MACX,MAAM;AAEL,iBAASA,MAAK,IAAI,IAAI;AAEtB,oBAAY,IAAI,IAAI;AAEpB,YAAI,OAAOC,YAAW,YAAY;AACjC,UAAAA,QAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,MAAM;AAEL,YAAI,OAAOC,aAAY,YAAY;AAClC,UAAAA,SAAQF,MAAK,IAAI;AAAA,QAClB;AAAA,MACD;AAAA,IACD;AAAA,EACD,OAAO;AACN,QAAI,OAAOE,aAAY,YAAY;AAClC,MAAAA,SAAQ;AAAA,IACT;AAAA,EACD;AAEA,SAAO;AACR;;;ACxDO,SAAS,WAA4B;AAC3C,QAAM,IAAI,MAAM,oBAAoB;AACrC;;;ACFO,SAAS,WAA4B;AAC3C,QAAM,IAAI,MAAM,oBAAoB;AACrC;;;ACFO,SAAS,YAA6B;AAC5C,QAAM,IAAI,MAAM,oBAAoB;AACrC;;;ACFO,SAAS,WAA4B;AAC3C,QAAM,IAAI,MAAM,oBAAoB;AACrC;;;ACmEO,SAAS,WAAW;AAC1B,QAAM,IAAI,MAAM,oBAAoB;AAsDrC;;;ACtHA,IAAI;AAGJ,aAAa,gBAAgB,YAAY,CAACC,cAAa;AACtD,cAAYA;AACb,CAAC;AAEM,SAAS,qBAAqB,aAAa,QAAQ;AACzD,MAAI;AAGJ,MAAI,UAAU,KAAK,SAAS,OAAO,GAAG;AACrC,YAAQ,QAAQ;AAAA;AAAA,MAEf,KAAK;AACJ,kBAAU,SAAS,WAAW;AAC9B;AAAA,MACD,KAAK;AACJ,kBAAU,SAAS,WAAW;AAC9B;AAAA,MACD,KAAK;AACJ,kBAAU,SAAS,WAAW;AAC9B;AAAA,MACD,KAAK;AACJ,kBAAU,SAAS,WAAW;AAC9B;AAAA,MACD,KAAK;AACJ,kBAAU,UAAU,WAAW;AAC/B;AAAA,IACF;AAAA,EACD;AAEA,MAAI,OAAO,YAAY,aAAa;AACnC,QAAI,UAAU,8BAA8B,QAAQ,MAAM,GAAG;AAC5D,cAAQ,IAAI,0CAA0C,QAAQ,MAAM;AACpE,aAAO;AAAA,IACR;AAAA,EACD;AAEA,QAAM,gCAAgC,SAAS,UAC5C,OAAO,QAAQ,SAAS,MACxB;AACJ;;;AC5BO,SAAS,aAAa,KAAKC,SAAQC,UAAS,UAAU;AAC5D,MAAI,OAAO,QAAQ,IAAI,IAAI,MAAM,aAAa;AAE7C,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,MAAM,QAAQ,IAAI,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG;AAC3D,MAAI,oBAAoB;AAExB,aAAW,WAAW,SAAS;AAC9B,UAAM,SAAS,aAAa,OAAO;AAEnC,YAAQ,QAAQ;AAAA;AAAA,MAEf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACJ,kBAAU,SAAS,eAAe,QAAQ,EACxC,KAAK,CAAC,gBAAgB;AACtB,cAAI;AACH,oBAAQ,IAAI,IAAI,IAAI,qBAAqB,aAAa,MAAM;AAC5D,gCAAoB;AACpB,gBAAI,OAAOD,YAAW,YAAY;AAEjC,cAAAA,QAAO;AAAA,YACR;AAAA,UACD,QAAQ;AAAA,UAER;AAAA,QACD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,cAAI,OAAOC,aAAY,YAAY;AAElC,YAAAA,SAAQ,KAAK;AAAA,UACd;AAAA,QACD,CAAC;AACF;AAAA;AAAA,MAGD,KAAK;AACJ,kBAAU,SAAS,QAAQ,QAAQ,EACjC,KAAK,CAAC,YAAY;AAClB,gBAAM,WAAW,IAAI,MAAM;AAC3B,mBAAS,SAAS,WAAY;AAC7B,oBAAQ,IAAI,IAAI,IAAI;AACpB,gBAAI,OAAOD,YAAW,YAAY;AAEjC,cAAAA,QAAO;AAAA,YACR;AAAA,UACD;AACA,mBAAS,UAAU,SAAU,OAAO;AACnC,gBAAI,OAAOC,aAAY,YAAY;AAClC,cAAAA,SAAQ,KAAK;AAAA,YACd;AAAA,UACD;AACA,mBAAS,MACR,qCAAqC,mBAAmB,OAAO;AAAA,QACjE,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,cAAI,OAAOA,aAAY,YAAY;AAClC,YAAAA,SAAQ,KAAK;AAAA,UACd;AAAA,QACD,CAAC;AACF,4BAAoB;AACpB;AAAA;AAAA,MAGD;AACC,kBAAU,SAAS,QAAQ,QAAQ,EACjC,KAAK,CAAC,SAAS;AACf,qBAAW,kBAAkB,IAAI,EAAE,KAAK,CAAC,WAAW;AACnD,oBAAQ,IAAI,IAAI,IAAI;AACpB,gBAAI,OAAOD,YAAW,YAAY;AAEjC,cAAAA,QAAO;AAAA,YACR;AAAA,UACD,CAAC;AAAA,QACF,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,cAAI,OAAOC,aAAY,YAAY;AAClC,YAAAA,SAAQ,KAAK;AAAA,UACd;AAAA,QACD,CAAC;AACF,4BAAoB;AACpB;AAAA,IACF;AAGA,QAAI,sBAAsB,MAAM;AAC/B,aAAO;AAAA,IACR;AAAA,EACD;AAGA,QAAM,IAAI,MAAM,8CAA8C,IAAI,IAAI;AACvE;;;AC1GO,SAAS,YAAYC,OAAMC,SAAQC,UAAS,UAAU;AAC5D,MAAI,OAAO,SAASF,MAAK,IAAI,MAAM,aAAa;AAE/C,WAAO;AAAA,EACR;AAEA,YAAUA,MAAK,KAAK,QAAQ,QAAQ,EAClC,KAAK,CAAC,aAAa;AACnB,aAASA,MAAK,IAAI,IAAI;AACtB,QAAI,OAAOC,YAAW,YAAY;AAEjC,MAAAA,QAAO;AAAA,IACR;AAAA,EACD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,QAAI,OAAOC,aAAY,YAAY;AAClC,MAAAA,SAAQ,KAAK;AAAA,IACd;AAAA,EACD,CAAC;AAEF,SAAO;AACR;;;ACxBO,SAAS,kBAAkBC,OAAMC,SAAQC,UAAS,UAAU;AAClE,QAAM,SAAS,WAAW,SAAS,cAAc,QAAQ;AAEzD,SAAO,MAAMF,MAAK;AAClB,SAAO,OAAO;AACd,MAAI,OAAO,gBAAgB,UAAU;AACpC,WAAO,cAAc,SAAS;AAAA,EAC/B;AACA,SAAO,QAAQ;AAEf,MAAI,OAAOC,YAAW,YAAY;AACjC,WAAO,SAAS,MAAM;AAErB,MAAAA,QAAO;AAAA,IACR;AAAA,EACD;AAEA,MAAI,OAAOC,aAAY,YAAY;AAClC,WAAO,UAAU,MAAM;AAEtB,MAAAA,SAAQF,MAAK,IAAI;AAAA,IAClB;AAAA,EACD;AAEA,aAAW,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAAE,YAAY,MAAM;AAEtE,SAAO;AACR;;;ACtBA,SAAS,eAAe,OAAO,WAAW;AACzC,OAAK,eAAe,OAAO,SAAS;AACrC;AAEA,IAAI,wBAAwB;AA4B5B,IAAqB,YAArB,MAAqB,mBAAkB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD,YAAY,IAAI,GAAG,IAAI,GAAG,OAAO,QAAQ,OAAO,OAAO;AAEtD;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,UAAU,cACd,OAAO,KAAK,aAAa,cACxB,KAAK,SAAS,QACd,WACD;AAAA,MACH,OAAO,WAAW,cACf,OAAO,KAAK,aAAa,cACxB,KAAK,SAAS,SACd,WACD;AAAA,IACJ;AAMA,SAAK,cAAc;AAOnB,SAAK,OAAO;AAMZ,SAAK,WAAW;AAQhB,SAAK,SAAS;AAOd,SAAK,WAAW;AAOhB,SAAK,YAAY;AAOjB,SAAK,WAAW;AAMhB,SAAK,gBAAgB,WAAY;AAAA,IAEjC;AASA,SAAK,0BAA0B;AAU/B,SAAK,kBAAkB,UAAU,IAAI,GAAG,GAAG,GAAG,CAAG;AAMjD,SAAK,YAAY;AAGjB,SAAK,gBAAgB;AAGrB,SAAK,cAAc;AAEnB,SAAK,YAAY,IAAI,GAAG,CAAC;AAGzB,QAAI,KAAK,SAAS,MAAM;AAEvB,mBAAa,YAAY,iBAAiB,MAAM;AAI/C,aAAK,aAAa;AAAA,MAEnB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AAEP,QAAI,KAAK,aAAa;AACrB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACpB;AAGA,UAAM,WAAW,KAAK,YAAY;AAClC,aAAS,IAAI,SAAS,QAAQ,OAAO,KAAK,GAAG,QAAQ,SAAS,EAAE,CAAC,GAAG;AAEnE,UAAI,SAAS,MAAM,iBAAiB,MAAM;AACzC,aAAK,eAAe,KAAK;AAAA,MAC1B;AAAA,IACD;AAEA,QAAI,OAAO,KAAK,qBAAqB,aAAa;AAEjD,WAAK,iBAAiB,SAAS;AAAA,IAChC;AAEA,SAAK,gBAAgB,SAAS,GAAG,GAAG,GAAG,CAAG;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAAS,OAAO,GAAG;AAClB,QAAI,MAAM,oBAAoB,YAAW;AACxC,YAAM,SAAS,eAAe,KAAK;AAAA,IACpC,OAAO;AAGN,UAAI,MAAM,cAAc;AAEvB,cAAM,OAAO,WAAW,MAAM,EAAE;AAAA,MACjC;AAAA,IACD;AAGA,UAAM,WAAW;AACjB,SAAK,YAAY,EAAE,KAAK,KAAK;AAG7B,QAAI,OAAO,MAAM,iBAAiB,YAAY;AAC7C,UAAI,KAAK,eAAe,MAAM;AAE7B,cAAM,WAAW;AAAA,MAClB;AACA,YAAM,aAAa;AAAA,IACpB;AAGA,QAAI,OAAO,MAAM,QAAQ,aAAa;AACrC,UAAI,OAAO,MAAM,UAAU;AAC1B,cAAM,IAAI,IAAI;AAAA,MACf,WAAW,KAAK,cAAc,MAAM;AACnC,cAAM,IAAI,IAAI,KAAK,YAAY,EAAE;AAAA,MAClC;AAAA,IACD;AAEA,QAAI,KAAK,aAAa,MAAM;AAC3B,WAAK,KAAK;AAAA,IACX;AAEA,QACC,OAAO,MAAM,oBAAoB,cACjC,KAAK,iBAAiB,GACrB;AACD,YAAM,gBAAgB;AAAA,IACvB;AAGA,QAAI,KAAK,4BAA4B,MAAM;AAC1C,WAAK,aAAa;AAAA,IACnB;AAGA,QAAI,KAAK,iBAAiB,GAAG;AAC5B,YAAM,iBAAiB,KAAK,gBAAgB;AAC5C,UAAI,MAAM,gBAAgB,MAAM;AAC/B,uBAAe,QAAQ,MAAM,IAAI;AAAA,MAClC;AAEA,UAAI,iBAAiB,YAAW;AAG/B,cAAM,QAAQ,CAAC,WAAW;AACzB,cAAI,OAAO,gBAAgB,MAAM;AAChC,2BAAe,QAAQ,OAAO,IAAI;AAAA,UACnC;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAGA,SAAK,UAAU;AAGf,SAAK,cAAc,KAAK,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC;AAE3D,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,OAAO,OAAO;AACxB,QAAI,SAAS,KAAK,SAAS,KAAK,YAAY,EAAE,QAAQ;AACrD,UAAI,MAAM,oBAAoB,YAAW;AACxC,cAAM,SAAS,eAAe,KAAK;AAAA,MACpC,OAAO;AAGN,YAAI,MAAM,cAAc;AAEvB,gBAAM,OAAO,WAAW;AAAA,QACzB;AAAA,MACD;AAGA,YAAM,WAAW;AACjB,WAAK,YAAY,EAAE,OAAO,OAAO,GAAG,KAAK;AAGzC,UAAI,OAAO,MAAM,iBAAiB,YAAY;AAC7C,YAAI,KAAK,eAAe,MAAM;AAE7B,gBAAM,WAAW;AAAA,QAClB;AACA,cAAM,aAAa;AAAA,MACpB;AAEA,UACC,OAAO,MAAM,oBAAoB,cACjC,KAAK,iBAAiB,GACrB;AACD,cAAM,gBAAgB;AAAA,MACvB;AAGA,UAAI,KAAK,4BAA4B,MAAM;AAC1C,aAAK,aAAa;AAAA,MACnB;AAGA,UAAI,KAAK,iBAAiB,GAAG;AAC5B,cAAM,iBAAiB,KAAK,gBAAgB;AAC5C,YAAI,MAAM,gBAAgB,MAAM;AAC/B,yBAAe,QAAQ,MAAM,IAAI;AAAA,QAClC;AAEA,YAAI,iBAAiB,YAAW;AAG/B,gBAAM,QAAQ,CAAC,WAAW;AACzB,gBAAI,OAAO,gBAAgB,MAAM;AAChC,6BAAe,QAAQ,OAAO,IAAI;AAAA,YACnC;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AAGA,WAAK,UAAU;AAGf,WAAK,cAAc,KAAK,MAAM,KAAK;AAEnC,aAAO;AAAA,IACR,OAAO;AACN,YAAM,IAAI,MAAM,YAAY,QAAQ,kCAAkC;AAAA,IACvE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,QAAQ,UAAU,SAAS;AAC1B,QAAI,IAAI;AACR,UAAM,WAAW,KAAK,YAAY;AAElC,UAAM,MAAM,SAAS;AAErB,QAAI,OAAO,aAAa,YAAY;AACnC,YAAM,IAAI,MAAM,WAAW,oBAAoB;AAAA,IAChD;AAEA,WAAO,IAAI,KAAK;AACf,eAAS,KAAK,WAAW,MAAM,SAAS,CAAC,GAAG,GAAG,QAAQ;AACvD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAO,QAAQ;AAC3B,UAAM,QAAQ,KAAK,cAAc,KAAK;AACtC,UAAM,SAAS,KAAK,cAAc,MAAM;AAExC,QAAI,UAAU,MAAM,WAAW,IAAI;AAElC,YAAM,KAAK,MAAM,IAAI;AACrB,YAAM,IAAI,IAAI,OAAO,IAAI;AACzB,aAAO,IAAI,IAAI;AAEf,WAAK,YAAY,EAAE,KAAK,IAAI;AAC5B,WAAK,YAAY,EAAE,MAAM,IAAI;AAE7B,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,YAAM,IAAI;AAAA,QACT,QACC,6DACA;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,OAAO;AACjB,QAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,EAAE,QAAQ;AACpD,aAAO,KAAK,YAAY,EAAE,KAAK;AAAA,IAChC,OAAO;AACN,YAAM,IAAI,MAAM,YAAY,QAAQ,kCAAkC;AAAA,IACvE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,OAAO;AACpB,WAAO,KAAK,YAAY,EAAE,QAAQ,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAO;AACnB,UAAM,QAAQ,KAAK,YAAY,EAAE,QAAQ,KAAK,IAAI;AAClD,QAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,EAAE,QAAQ;AACpD,aAAO,KAAK,WAAW,KAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAO;AACf,WAAO,SAAS,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,eAAe,MAAM,OAAO;AAC3B,QAAI,UAAU,CAAC;AAKf,aAASG,SAAQ,KAAKC,OAAM;AAC3B,YAAM,IAAI,IAAIA,KAAI;AAClB,UAAI,iBAAiB,UAAU,OAAO,MAAM,UAAU;AACrD,YAAI,MAAM,KAAK,CAAC,GAAG;AAClB,kBAAQ,KAAK,GAAG;AAAA,QACjB;AAAA,MACD,WAAW,MAAM,OAAO;AACvB,gBAAQ,KAAK,GAAG;AAAA,MACjB;AAAA,IACD;AAEA,SAAK,QAAQ,CAAC,UAAU;AACvB,MAAAD,SAAQ,OAAO,IAAI;AACnB,UAAI,iBAAiB,YAAW;AAC/B,kBAAU,QAAQ,OAAO,MAAM,eAAe,MAAM,KAAK,CAAC;AAAA,MAC3D;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,WAAW;AACzB,QAAI,UAAU,CAAC;AAEf,SAAK,QAAQ,CAAC,UAAU;AACvB,UAAI,iBAAiB,WAAW;AAC/B,gBAAQ,KAAK,KAAK;AAAA,MACnB;AACA,UAAI,iBAAiB,YAAW;AAC/B,kBAAU,QAAQ,OAAO,MAAM,eAAe,SAAS,CAAC;AAAA,MACzD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,MAAM;AACpB,WAAO,KAAK,eAAe,QAAQ,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,MAAM;AACpB,UAAM,MAAM,KAAK,eAAe,QAAQ,IAAI;AAC5C,WAAO,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,QAAI,OAAO,KAAK,aAAa,aAAa;AACzC,WAAK,WAAW,CAAC;AAAA,IAClB;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAAW,MAAM;AAC7B,UAAM,SAAS,KAAK,UAAU;AAG9B,UAAM,aAAa,QAAQ;AAE3B,QAAI,KAAK,4BAA4B,MAAM;AAC1C,WAAK,QAAQ,CAAC,UAAU;AACvB,YAAI,MAAM,cAAc;AACvB,gBAAM,cAAc,MAAM,aAAa,QAAQ;AAC/C,cAAI,YAAY,SAAS,GAAG;AAC3B,mBAAO,UAAU,WAAW;AAAA,UAC7B;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB;AAClB,QAAI,KAAK,SAAS,MAAM;AACvB,aAAO;AAAA,IACR,OAAO;AACN,UAAI,WAAW,KAAK;AACpB,aAAO,UAAU;AAChB,YAAI,SAAS,SAAS,MAAM;AAC3B,iBAAO;AAAA,QACR;AACA,mBAAW,SAAS;AAAA,MACrB;AACA,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AACjB,QAAI,KAAK,SAAS,MAAM;AACvB,aAAO;AAAA,IACR,OAAO;AACN,UAAI,WAAW,KAAK;AACpB,aAAO,UAAU;AAChB,YAAI,SAAS,SAAS,MAAM;AAC3B;AAAA,QACD;AACA,mBAAW,SAAS;AAAA,MACrB;AACA,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AACjB,SAAK,QAAQ,CAAC,UAAU;AACvB,UAAI,OAAO,MAAM,oBAAoB,YAAY;AAChD,cAAM,gBAAgB;AAAA,MACvB;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,OAAO,WAAW;AAC7B,QAAI,KAAK,SAAS,KAAK,GAAG;AACzB,YAAM,gBAAgB,MAAM,OAAO,SAAS;AAAA,IAC7C,OAAO;AACN,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,OAAO,WAAW;AAChC,QAAI,KAAK,SAAS,KAAK,KAAK,KAAK,cAAc,KAAK,KAAK,GAAG;AAC3D,UAAI,OAAO,MAAM,sBAAsB,YAAY;AAClD,cAAM,kBAAkB;AAAA,MACzB;AAIA,UAAI,MAAM,gBAAgB,MAAM;AAC/B,cAAM,OAAO,KAAK,gBAAgB;AAClC,YAAI,MAAM;AACT,eAAK,WAAW,MAAM,IAAI;AAAA,QAC3B;AAAA,MACD;AAEA,UAAI,CAAC,WAAW;AAEf,YAAI,oBAAK,KAAK,OAAO,KAAK,MAAM,OAAO;AAEtC,cAAI,OAAO,MAAM,YAAY,YAAY;AACxC,kBAAM,QAAQ;AAAA,UACf;AAAA,QACD;AAAA,MACD;AAIA,YAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,UAAI,cAAc,GAAG;AACpB,aAAK,YAAY,EAAE,OAAO,YAAY,CAAC;AACvC,cAAM,WAAW;AAAA,MAClB;AAGA,UAAI,KAAK,4BAA4B,MAAM;AAC1C,aAAK,aAAa;AAAA,MACnB;AAGA,WAAK,UAAU;AAGf,WAAK,cAAc,KAAK,MAAM,UAAU;AAAA,IACzC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,MAAM,OAAO,WAAW;AACzC,SAAK,QAAQ,CAAC,UAAU;AACvB,UAAI,cAAc,QAAQ,iBAAiB,YAAW;AACrD,cAAM,kBAAkB,MAAM,OAAO,SAAS;AAAA,MAC/C;AACA,YAAM,IAAI,IAAI;AAAA,IACf,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAO;AACb,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,QAAI,aAAa,KAAK,GAAG;AAExB,WAAK,aAAa,OAAO,KAAK,WAAW,aAAa,CAAC,CAAC;AAExD,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAO;AACf,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,QAAI,cAAc,KAAK,aAAa,IAAI,KAAK,YAAY,EAAE,QAAQ;AAElE,WAAK,aAAa,OAAO,KAAK,WAAW,aAAa,CAAC,CAAC;AAExD,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,QAAI,aAAa,GAAG;AACnB,YAAM,WAAW,KAAK,YAAY;AAElC,eAAS,OAAO,GAAG,GAAG,SAAS,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;AAEvD,YAAM,IAAI,IAAI,SAAS,CAAC,EAAE,IAAI,IAAI;AAElC,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,OAAO;AACnB,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,UAAM,WAAW,KAAK,YAAY;AAClC,QAAI,cAAc,KAAK,aAAa,SAAS,SAAS,GAAG;AAExD,eAAS;AAAA,QACR,SAAS,SAAS;AAAA,QAClB;AAAA,QACA,SAAS,OAAO,YAAY,CAAC,EAAE,CAAC;AAAA,MACjC;AAEA,YAAM,IAAI,IAAI,SAAS,SAAS,SAAS,CAAC,EAAE,IAAI,IAAI;AAEpD,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,WAAW;AAEf,QAAI,CAAC,KAAK,aAAa;AACtB,UAAI,cAAc,MAAM;AACvB,aAAK,QAAQ,CAAC,UAAU;AACvB,cAAI,iBAAiB,YAAW;AAG/B,kBAAM,KAAK,SAAS;AAAA,UACrB;AAAA,QACD,CAAC;AAAA,MACF;AACA,WAAK,cAAc,MAAM,WAAY;AAEpC,aAAK,YAAY,EAAE,KAAK,KAAK,UAAU,KAAK,OAAO,YAAY,CAAC,CAAC;AAEjE,aAAK,cAAc;AAEnB,aAAK,UAAU;AAAA,MAChB,GAAG,IAAI;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB;AACnB,SAAK,QAAQ,CAAC,UAAU;AACvB,UAAI,OAAO,MAAM,sBAAsB,YAAY;AAClD,cAAM,kBAAkB;AAAA,MACzB;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,GAAG,GAAG;AACZ,WAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,YAAY;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,GAAG,GAAG;AACnB,WAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,WAAW;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,GAAG,GAAG;AACZ,QAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK;AACrB,aAAO,EAAE,MAAM,YAAY;AAAA,IAC5B;AACA,UAAM,SAAS,EAAE,IAAI,IAAI,EAAE,IAAI;AAC/B,WAAO,SAAS,SAAS,EAAE,IAAI,IAAI,EAAE,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,GAAG,GAAG;AACZ,QAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK;AACrB,aAAO,EAAE,MAAM,YAAY;AAAA,IAC5B;AACA,UAAM,SAAS,EAAE,IAAI,IAAI,EAAE,IAAI;AAC/B,WAAO,SAAS,SAAS,EAAE,IAAI,IAAI,EAAE,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,SAAK,MAAM;AAEX,UAAM,QAAQ,SAAS;AAEvB,cAAU,QAAQ,KAAK,eAAe;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,IAAI;AACV,QAAI,aAAa;AACjB,UAAM,WAAW,cAAM,SAAS;AAChC,UAAM,WAAW,KAAK,YAAY;AAClC,UAAM,iBAAiB,SAAS;AAChC,UAAM,UAAU,cAAM,QAAQ,EAAE;AAEhC,aAAS,IAAI,gBAAgB,KAAK,KAAM,MAAM,SAAS,CAAC,KAAM;AAC7D,UAAI,YAAY,CAAC,IAAI,kBAAkB;AAEtC;AAAA,MACD;AAEA,UAAI,IAAI,cAAc;AACrB,qBAAa,wBAAwB,KAAK,IAAI;AAC9C,YAAI,YAAY;AACf;AAAA,QACD;AAGA,YAAI,aAAa;AAEjB,gBAAQ,QAAQ,CAAC,WAAW;AAC3B,cAAI,OAAO,UAAU,KAAK,UAAU,GAAG;AACtC,gBAAI,aAAa;AAAA,UAClB;AAAA,QACD,CAAC;AAGD,aAAK,YAAY,IAAI,cAAc,IAAI,iBAAiB,IAAI,OAAO,EAAE;AAErE,YAAI,wBAAwB,GAAG;AAC9B;AAAA,QACD;AAAA,MACD,OAAO;AAEN,aAAK,WAAW,IAAI,OAAO,EAAE;AAAA,MAC9B;AAAA,IACD;AAGA,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKE,WAAU,UAAU;AACxB,QAAI,aAAa;AACjB,UAAM,SAAS,KAAK,UAAU;AAE9B,SAAK,YAAY;AAGjB,QACC,KAAK,SAAS,SACd,KAAK,aAAa,QAClB,OAAO,SAAS,MAAM,MACrB;AACD,MAAAA,UAAS,SAAS,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM;AAAA,IACvE;AAGA,IAAAA,UAAS,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAGzC,QAAI,KAAK,gBAAgB,QAAQ,IAAI,KAAK;AACzC,MAAAA,UAAS,WAAW,KAAK,eAAe;AAAA,IACzC;AAEA,UAAM,WAAW,KAAK,YAAY;AAClC,aAAS,IAAI,SAAS,QAAQ,KAAK,KAAM,MAAM,SAAS,CAAC,KAAM;AAC9D,UAAI,IAAI,cAAc;AACrB,qBAAa,IAAI,aAAa;AAE9B,YAAI,IAAI,cAAc,YAAY;AACjC,cAAI,YAAY;AAEf,YAAAA,UAAS,KAAK;AACd,YAAAA,UAAS,eAAe;AAAA,UACzB;AAGA,cAAI,QAAQA,SAAQ;AAGpB,cAAI,KAAKA,WAAU,QAAQ;AAG3B,cAAI,SAASA,SAAQ;AAGrB,cAAI,YAAY;AACf,YAAAA,UAAS,QAAQ;AAAA,UAClB;AAEA,eAAK;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;ACr+BO,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,qBAAqB,EAAE,aAAa,aAAa;AAGvD,IAAM,kBAAkB;;;ACF/B,SAAS,aACR,UACA,UACA,KACA,KACC;AACD,QAAM,MAAM,KAAK,IAAI,QAAQ;AAC7B,QAAM,MAAM,KAAK,IAAI,QAAQ;AAE7B,QAAM,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG;AAElD,QAAM,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM;AACxC,QAAM,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM;AAExC,SAAO,CAAC,IAAI,EAAE;AACf;AAKA,SAAS,YACR,CAAC,KAAK,KAAK,KAAK,GAAG,GACnB,CAAC,IAAI,EAAE,GACN;AACD,SAAO,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE;AACjD;AAKA,SAAS,QAAQ,CAAC,IAAI,EAAE,GAAqB,CAAC,IAAI,EAAE,GAAqB;AACxE,SAAO,CAAC,KAAK,IAAI,KAAK,EAAE;AACzB;AAKA,SAAS,UAAU,CAAC,IAAI,EAAE,GAAqB,QAAgB;AAC9D,SAAO,CAAC,KAAK,QAAQ,KAAK,MAAM;AACjC;AAKA,SAAS,QAAQ,CAAC,IAAI,EAAE,GAAqB,CAAC,IAAI,EAAE,GAAqB;AACxE,SAAO,KAAK,KAAK,KAAK;AACvB;AAKA,SAAS,QAAQ,CAAC,IAAI,EAAE,GAAqB;AAC5C,SAAO,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC;AACnC;AAKA,SAAS,UAAU,GAAqB,GAAqB;AAC5D,QAAM,CAAC,IAAI,EAAE,IAAI;AACjB,QAAM,CAAC,IAAI,EAAE,IAAI;AACjB,QAAMC,QAAO,KAAK,KAAK,KAAK,MAAM,IAAI,IAAI;AAC1C,SAAOA,QAAO,KAAK,KAAK,QAAQ,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC,EAAE;AAClE;AAoBO,SAAS,iCACf,IACA,IACA,IACA,IACA,cACA,WACA,KACA,KACA,kBACC;AACD,QAAM,gBAAgB,SAAS,gBAAgB;AAE/C,QAAM,SAAS,KAAK,IAAI,aAAa;AACrC,QAAM,SAAS,KAAK,IAAI,aAAa;AAErC,QAAM,CAAC,KAAK,GAAG,IAAI;AAAA,IAClB,CAAC,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AAAA,IAChC,EAAE,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;AAAA,EAC9B;AAEA,QAAM,CAAC,IAAI,EAAE,IAAI,aAAa,KAAK,KAAK,KAAK,GAAG;AAEhD,QAAMA,QAAO,iBAAiB,YAAY,IAAI;AAC9C,QAAM,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG;AACpE,QAAM,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG;AAEhD,QAAM,CAAC,KAAK,GAAG,IAAI;AAAA,IAClB,CAAE,KAAK,MAAO,IAAK,CAAC,KAAK,MAAO,EAAE;AAAA,IAClCA,QAAO,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC;AAAA,EACjC;AAEA,QAAM,CAAC,IAAI,EAAE,IAAI;AAAA,IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,QAAQ,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC;AAAA,IACzD,EAAE,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;AAAA,EAC9B;AAEA,QAAM,IAAI,EAAE,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE;AAC7C,QAAM,IAAI,EAAE,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO,EAAE;AAC/C,QAAM,aAAa,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AACtC,QAAM,cAAc,UAAU,GAAG,CAAC,KAAK,IAAI,KAAK;AAEhD,QAAM,aACL,CAAC,aAAa,cAAc,IACzB,cAAc,IAAI,KAAK,KACvB,aAAa,cAAc,IAC1B,cAAc,IAAI,KAAK,KACvB;AAEL,QAAM,WAAW,aAAa;AAE9B,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,aAAa;AAAA,EAC7B;AACD;;;ACxIA,IAAM,SAAN,MAAa;AAAA,EACZ,YAAY,SAAS;AAKpB,SAAK,SAAS,CAAC;AAOf,SAAK,gBAAgB;AAGrB,SAAK,WAAW,CAAC;AAGjB,SAAK,aAAa,UAAU,IAAI;AAGhC,SAAK,UAAU;AAEf,QAAI,OAAO,YAAY,UAAU;AAChC,WAAK,aAAa,OAAO;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAS;AAErB,UAAM,eAAe,QAAQ,MAAM,wBAAwB;AAC3D,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AACxB,QAAI,YAAY;AAEhB,SAAK,UAAU;AAGf,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC7C,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,UAAU,YAAY,CAAC,EAAE,YAAY;AAC3C,YAAM,cAAc,YAClB,MAAM,CAAC,EACP,KAAK,EACL,MAAM,QAAQ,EACd,IAAI,UAAU;AAEhB,cAAQ,SAAS;AAAA,QAChB,KAAK;AACJ;AAEC,kBAAM,IAAI,iCAAiC,GAAG,WAAW;AACzD,iBAAK;AAAA,cACJ,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,cACF,EAAE;AAAA,YACH;AAAA,UACD;AACA;AAAA,QACD,KAAK;AAEJ,sBACC,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAC5D,eAAK,OAAO,UAAU,IAAI,YAAY,CAAC,GAAG,UAAU,CAAC;AACrD;AAAA,QACD,KAAK;AAEJ,sBACC,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAC5D,eAAK,OAAO,UAAU,GAAG,UAAU,IAAI,YAAY,CAAC,CAAC;AACrD;AAAA,QACD,KAAK;AAEJ,eAAK,OAAO,GAAG,WAAW;AAC1B;AAAA,QACD,KAAK;AAEJ,eAAK,OAAO,GAAG,WAAW;AAC1B;AAAA,QACD,KAAK;AAEJ,eAAK,iBAAiB,GAAG,WAAW;AACpC;AAAA,QACD,KAAK;AAEJ,eAAK,cAAc,GAAG,WAAW;AACjC;AAAA,QACD,KAAK;AACJ,eAAK,UAAU;AACf;AAAA,QACD;AACC,kBAAQ,KAAK,wBAAwB,OAAO;AAC5C;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AAEX,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,gBAAU,QAAQ,KAAK;AAAA,IACxB,CAAC;AACD,SAAK,UAAU;AACf,SAAK,OAAO,SAAS;AACrB,SAAK,WAAW,IAAI,GAAG,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY;AACX,UAAM,SAAS,KAAK;AACpB,QAAI,OAAO,SAAS,GAAG;AACtB,YAAM,aAAa,OAAO,CAAC;AAC3B,UAAI,CAAC,WAAW,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,GAAG;AAClD,aAAK,OAAO,WAAW,GAAG,WAAW,CAAC;AAAA,MACvC;AACA,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AACjB,UAAM,WAAW,KAAK;AAEtB,QAAI,KAAK,SAAS;AACjB,YAAM,SAAS,KAAK;AACpB,YAAM,UAAU;AAAA,QACf,OAAO,QAAQ,CAAC,MAAM;AACrB,iBAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAAA,QACjB,CAAC;AAAA,MACF;AACA,YAAM,gBAAgB,QAAQ;AAG9B,aAAO,SAAS,SAAS,eAAe;AACvC,iBAAS,KAAK,UAAU,IAAI,CAAC;AAAA,MAC9B;AAGA,eAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACvC,cAAM,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAC/B,iBAAS,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC;AAAA,MACjC;AAGA,aAAO,SAAS,SAAS,eAAe;AACvC,kBAAU,QAAQ,SAAS,SAAS,SAAS,CAAC,CAAC;AAC/C,iBAAS,UAAU;AAAA,MACpB;AACA,WAAK,UAAU;AAAA,IAChB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG,GAAG;AACZ,SAAK,WAAW,IAAI,GAAG,CAAC;AACxB,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG,GAAG;AACZ,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AACxB,UAAM,YACL,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAE5D,QAAI,CAAC,WAAW,OAAO,SAAS,GAAG;AAClC,aAAO,KAAK,UAAU,IAAI,WAAW,GAAG,WAAW,CAAC,CAAC;AAAA,IACtD,OAAO;AACN,aAAO,KAAK,UAAU,IAAI,UAAU,GAAG,UAAU,CAAC,CAAC;AAAA,IACpD;AACA,WAAO,KAAK,UAAU,IAAI,GAAG,CAAC,CAAC;AAE/B,eAAW,IAAI;AACf,eAAW,IAAI;AAEf,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,GAAG,GAAG,QAAQ,YAAY,UAAU,gBAAgB,OAAO;AAG9D,QAAI,eAAe,UAAU;AAC5B;AAAA,IACD;AACA,UAAM,aAAa,gBAChB,KAAK,IAAI,aAAa,QAAQ,KAAK,MACnC,KAAK,IAAI,WAAW,UAAU,KAAK;AAEtC,iBAAa,aAAa;AAC1B,eAAW,WAAW;AAEtB,QAAI,aAAa,GAAG;AACnB,oBAAc;AAAA,IACf;AACA,QAAI,WAAW,GAAG;AACjB,kBAAY;AAAA,IACb;AAEA,QAAI,cAAc,UAAU;AAC3B,kBAAY;AAAA,IACb;AAEA,QAAI,OAAO,WAAW;AACtB,QAAI,YAAY;AAChB,QAAI,eAAe;AAClB,kBAAY;AACZ,aAAO,MAAM;AAAA,IACd;AAEA,QAAI,YAAY;AACf,aAAO;AAAA,IACR;AAEA,UAAM,SAAS,OAAO;AACtB,UAAM,6BAA6B,SAAS,KAAK;AACjD,UAAM,SAAS,OAAO;AACtB,UAAM,YAAY,SAAS;AAE3B,SAAK;AAAA,MACJ,IAAI,SAAS,KAAK,IAAI,UAAU;AAAA,MAChC,IAAI,SAAS,KAAK,IAAI,UAAU;AAAA,IACjC;AAEA,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,4BAA4B,KAAK;AACpD,WAAK,OAAO,IAAI,SAAS,KAAK,IAAI,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,KAAK,CAAC;AACtE,eAAS;AAAA,IACV;AAEA,SAAK;AAAA,MACJ,IAAI,SAAS,KAAK,IAAI,QAAQ;AAAA,MAC9B,IAAI,SAAS,KAAK,IAAI,QAAQ;AAAA,IAC/B;AAEA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAI,IAAI,IAAI,IAAI,QAAQ;AAC7B,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AACxB,UAAM,YACL,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAG5D,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,UAAU;AAErB,QAAI,KAAK,KAAK;AACd,QAAI,KAAK,KAAK;AACd,QAAI,KAAK,KAAK;AACd,QAAI,KAAK,KAAK;AAGd,UAAM,MAAM,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AACvD,UAAM,MAAM,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;AACvD,UAAM;AACN,UAAM;AACN,UAAM;AACN,UAAM;AACN,UAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,EAAE;AAGpD,UAAM,iBAAiB,KAAK,IAAI,QAAQ,CAAC;AACzC,UAAM,QAAQ,SAAS;AAEvB,UAAM,kBAAkB,KAAK,KAAK;AAClC,UAAM,kBAAkB,KAAK,KAAK;AAClC,UAAM,kBAAkB,KAAK,KAAK;AAClC,UAAM,kBAAkB,KAAK,KAAK;AAElC,SAAK,OAAO,iBAAiB,eAAe;AAE5C,QAAI,UAAU,KAAK,MAAM;AACzB,QAAI,UAAU,KAAK,MAAM;AACzB,UAAM,UAAU,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,CAAC;AACnE,cAAU;AACV,cAAU;AAEV,UAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAChE,UAAM,UAAU,KAAK,QAAQ;AAC7B,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,aAAa,KAAK;AAAA,MACvB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACnB;AACA,UAAM,WAAW,KAAK;AAAA,MACrB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACnB;AAEA,SAAK,IAAI,SAAS,SAAS,QAAQ,YAAY,QAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QACC,GACA,GACA,SACA,SACA,UACA,YACA,UACA,gBAAgB,OACf;AAED,QAAI,eAAe,UAAU;AAC5B;AAAA,IACD;AACA,UAAM,aAAa,gBAChB,KAAK,IAAI,aAAa,QAAQ,KAAK,MACnC,KAAK,IAAI,WAAW,UAAU,KAAK;AAGtC,iBAAa,aAAa;AAC1B,eAAW,WAAW;AACtB,QAAI,aAAa,GAAG;AACnB,oBAAc;AAAA,IACf;AACA,QAAI,WAAW,GAAG;AACjB,kBAAY;AAAA,IACb;AAEA,QAAI,cAAc,UAAU;AAC3B,kBAAY;AAAA,IACb;AAEA,QAAI,OAAO,WAAW;AAEtB,QAAI,YAAY;AAChB,QAAI,eAAe;AAClB,kBAAY;AACZ,aAAO,MAAM;AAAA,IACd;AAEA,QAAI,YAAY;AACf,aAAO;AAAA,IACR;AAEA,UAAM,UAAU,OAAO,UAAU,OAAO,WAAW;AACnD,UAAM,6BAA6B,SAAS,KAAK;AACjD,UAAM,SAAS,OAAO;AACtB,UAAM,YAAY,SAAS;AAE3B,QAAI,QAAQ;AACZ,UAAM,eAAe,KAAK,IAAI,QAAQ;AACtC,UAAM,eAAe,KAAK,IAAI,QAAQ;AAEtC,SAAK;AAAA,MACJ,IAAI,UAAU,KAAK,IAAI,UAAU;AAAA,MACjC,IAAI,UAAU,KAAK,IAAI,UAAU;AAAA,IAClC;AAEA,aAAS,IAAI,GAAG,IAAI,4BAA4B,KAAK;AACpD,YAAM,MAAM,UAAU,KAAK,IAAI,KAAK;AACpC,YAAM,MAAM,UAAU,KAAK,IAAI,KAAK;AACpC,YAAM,MAAM,IAAI,MAAM,eAAe,MAAM;AAC3C,YAAM,MAAM,IAAI,MAAM,eAAe,MAAM;AAC3C,WAAK,OAAO,KAAK,GAAG;AACpB,eAAS;AAAA,IACV;AAEA,SAAK;AAAA,MACJ,IAAI,UAAU,KAAK,IAAI,UAAU;AAAA,MACjC,IAAI,UAAU,KAAK,IAAI,UAAU;AAAA,IAClC;AACA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAiB,KAAK,KAAK,GAAG,GAAG;AAChC,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AACxB,UAAM,YACL,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAC5D,UAAM,WAAW,UAAU,IAAI,EAAE,IAAI,GAAG,CAAC;AACzC,UAAM,eAAe,UAAU,IAAI,EAAE,IAAI,KAAK,GAAG;AACjD,UAAM,aAAa,KAAK;AAExB,UAAM,IAAI,IAAI;AACd,aAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACrC,WAAK;AAAA,QACJ,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAClC,aAAa,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IACvC,SAAS,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,QAC/B,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAClC,aAAa,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IACvC,SAAS,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,MAChC;AAAA,IACD;AACA,cAAU,QAAQ,QAAQ;AAC1B,cAAU,QAAQ,YAAY;AAC9B,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,MAAM,MAAM,MAAM,MAAM,GAAG,GAAG;AAC3C,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AACxB,UAAM,YACL,OAAO,WAAW,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AAC5D,UAAM,WAAW,UAAU,IAAI,EAAE,IAAI,GAAG,CAAC;AACzC,UAAM,gBAAgB,UAAU,IAAI,EAAE,IAAI,MAAM,IAAI;AACpD,UAAM,gBAAgB,UAAU,IAAI,EAAE,IAAI,MAAM,IAAI;AACpD,UAAM,aAAa,KAAK;AAExB,UAAM,IAAI,IAAI;AACd,aAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACrC,WAAK;AAAA,QACJ,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAClC,cAAc,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IACnD,cAAc,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,IACrD,SAAS,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,QAC/B,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAClC,cAAc,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IACnD,cAAc,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,IACrD,SAAS,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,MAChC;AAAA,IACD;AAEA,cAAU,QAAQ,UAAU,eAAe,aAAa;AACxD,cAAU,QAAQ,aAAa;AAC/B,cAAU,QAAQ,aAAa;AAC/B,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,GAAG,GAAG,OAAO,QAAQ;AACzB,SAAK,OAAO,GAAG,CAAC;AAChB,SAAK,OAAO,IAAI,OAAO,CAAC;AAExB,SAAK,OAAO,IAAI,OAAO,CAAC;AACxB,SAAK,OAAO,IAAI,OAAO,IAAI,MAAM;AAEjC,SAAK,OAAO,IAAI,OAAO,IAAI,MAAM;AACjC,SAAK,OAAO,GAAG,IAAI,MAAM;AAEzB,SAAK,OAAO,GAAG,IAAI,MAAM;AACzB,SAAK,OAAO,GAAG,CAAC;AAEhB,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,GAAG,GAAG,OAAO,QAAQ,QAAQ;AACtC,SAAK,OAAO,IAAI,QAAQ,CAAC;AACzB,SAAK,OAAO,IAAI,QAAQ,QAAQ,CAAC;AACjC,SAAK,MAAM,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,QAAQ,MAAM;AAEtD,SAAK,OAAO,IAAI,OAAO,IAAI,MAAM;AACjC,SAAK,OAAO,IAAI,OAAO,IAAI,SAAS,MAAM;AAC1C,SAAK,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,MAAM;AAExE,SAAK,OAAO,IAAI,QAAQ,QAAQ,IAAI,MAAM;AAC1C,SAAK,OAAO,IAAI,QAAQ,IAAI,MAAM;AAClC,SAAK,MAAM,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,QAAQ,MAAM;AAExD,SAAK,OAAO,GAAG,IAAI,SAAS,MAAM;AAClC,SAAK,OAAO,GAAG,IAAI,MAAM;AACzB,SAAK,MAAM,GAAG,GAAG,IAAI,QAAQ,GAAG,MAAM;AAEtC,SAAK,UAAU;AAAA,EAChB;AACD;AAEA,IAAO,iBAAQ;;;ACziBf,IAAM,oBAAoB;AAAA,EACzB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,8BAA8B;AAAA,EAC9B,cAAc;AAAA,EACd,iBAAiB;AAClB;AAGA,IAAI;AAGJ,SAAS,cAAc,QAAQ,YAAY;AAC1C,MAAI;AAEJ,MAAI,WAAW,YAAY,MAAM;AAEhC,cAAU,OAAO,WAAW,WAAW,SAAS;AAAA,MAC/C,oBAAoB,WAAW;AAAA,IAChC,CAAC;AAAA,EACF,WAAW,WAAW,YAAY,SAAS;AAC1C,UAAM,OAAO;AAAA,MACZ,OAAO,WAAW;AAAA,MAClB,WAAW,WAAW;AAAA,MACtB,OAAO,WAAW;AAAA,MAClB,SAAS;AAAA,MACT,uBAAuB;AAAA,MACvB,oBAAoB,WAAW,cAC5B,WAAW,qBACX;AAAA,MACH,iBAAiB,WAAW;AAAA,MAC5B,8BAA8B,WAAW;AAAA,IAC1C;AAGA,QAAI,WAAW,iBAAiB,MAAM;AACrC,gBAAU,OAAO,WAAW,UAAU,IAAI;AAC1C,UAAI,SAAS;AACZ,uBAAe;AAAA,MAChB;AAAA,IACD;AAGA,QAAI,CAAC,SAAS;AACb,qBAAe;AACf,gBACC,OAAO,WAAW,SAAS,IAAI,KAC/B,OAAO,WAAW,sBAAsB,IAAI;AAAA,IAC9C;AAEA,QAAI,CAAC,SAAS;AACb,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACxD;AAAA,EACD,OAAO;AACN,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAGA,SAAO;AACR;AAKA,IAAM,qBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxB,YAAY,OAAO,QAAQ,aAAa,mBAAmB;AAa1D,SAAK,aAAa,OAAO,OAAO,CAAC,GAAG,mBAAmB,UAAU;AAGjE,QAAI,OAAO,WAAW,YAAY,aAAa;AAC9C,iBAAW,UAAU;AAAA,IACtB;AAGA,QAAI,OAAO,WAAW,WAAW,aAAa;AAC7C,WAAK,SAAS,WAAW;AAAA,IAC1B,OAAO;AACN,WAAK,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA,KAAK,WAAW;AAAA,MACjB;AAAA,IACD;AAGA,SAAK,UAAU,cAAc,KAAK,QAAQ,KAAK,UAAU;AAEzD,SAAK,eAAe;AAGpB,SAAK,aAAa,KAAK,WAAW,SAAS;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAO,QAAQ;AAC3B,SAAK,MAAM;AACX,SAAK,OAAO,OAAO,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,SAAK,QAAQ,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1C,SAAK,QAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAaC,UAAS,OAAO;AAC5B,UAAM,SAAS,KAAK;AAGpB,gBAAY,yBAAyBA,SAAQ,KAAK,OAAO;AAGzD,QAAI,OAAO,OAAO,UAAU,aAAa;AACxC,UAAIA,YAAW,MAAM;AAEpB,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,iBAAiB,IAAI;AAClC,eAAO,MAAM,sBAAsB;AAAA,MACpC,OAAO;AACN,eAAO,MAAM,iBAAiB,IAAI;AAAA,MACnC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,QAAQ;AACrB,SAAK,OAAO,QAAQ,KAAK,MAAM,KAAK;AACpC,SAAK,OAAO,SAAS,KAAK,MAAM,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAa,GAAG,GAAG,OAAO,QAAQ;AAEjC,QAAI,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,CAAC;AACjD,QAAI,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,KAAK,OAAO,SAAS,CAAC;AAClD,YAAQ,MAAM,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC;AAC7C,aAAS,MAAM,QAAQ,GAAG,KAAK,OAAO,SAAS,CAAC;AAEhD,WAAO,KAAK,QAAQ,aAAa,GAAG,GAAG,OAAO,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAO,aAAa,SAAS;AACnC,QAAI,OAAO,KAAK,OAAO,kBAAkB,YAAY;AACpD,aAAO,KAAK,OAAO,cAAc,EAAE,MAAM,QAAQ,CAAC;AAAA,IACnD,OAAO;AACN,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,aAAK,OAAO;AAAA,UACX,CAAC,SAAS;AACT,oBAAQ,IAAI;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,OAAO,aAAa,SAAS;AAC1C,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,UAAI,OAAO,KAAK,OAAO,0BAA0B,YAAY;AAC5D,gBAAQ,KAAK,OAAO,sBAAsB,CAAC;AAAA,MAC5C,OAAO;AACN,cAAM,QAAQ,IAAI,MAAM;AACxB,cAAM,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO;AAC/C,cAAM,SAAS,MAAM;AACpB,qBAAW,kBAAkB,KAAK,EAAE,KAAK,CAAC,WAAW;AACpD,mBAAO,QAAQ,MAAM;AAAA,UACtB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,OAAO,aAAa,SAAS;AACtC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,cAAQ,KAAK,OAAO,UAAU,MAAM,OAAO,CAAC;AAAA,IAC7C,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAWC,WAAU;AACpB,QAAI,OAAOA,UAAS,OAAO,aAAa;AAEvC,MAAAA,UAAS,cAAc,MAAM;AAE7B,WAAK,gBAAgBA,UAAS,MAAM;AAAA,QACnCA,UAAS,MAAM,IAAI,KAAK,MAAM;AAAA,MAC/B;AACA,MAAAA,UAAS,kBAAkB,gBAAgB,MAAM,KAAK,aAAa;AAAA,IACpE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACT,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,QAAQ;AACX,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA,EAEA,IAAI,MAAM,KAAK;AACd,SAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAAS;AACZ,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA,EAEA,IAAI,OAAO,KAAK;AACf,SAAK,OAAO,SAAS,KAAK,MAAM,GAAG;AAAA,EACpC;AACD;AAEA,IAAO,6BAAQ;;;AC9Sf,IAAqB,WAArB,MAA8B;AAAA;AAAA;AAAA;AAAA,EAI7B,YAAY,SAAS;AAMpB,SAAK,eAAe,IAAI;AAAA,MACvB,QAAQ;AAAA,MACR,QAAQ;AAAA;AAAA,MAER,OAAO,WAAW,WAAW,cAC1B,OAAO,OAAO,SAAS,EAAE,QAAQ,WAAW,OAAO,CAAC,IACpD;AAAA,IACJ;AAOA,SAAK,WAAW;AAOhB,SAAK,cAAc,KAAK,SAAS,QAAQ,KAAK,SAAS;AAOvD,SAAK,aAAa,IAAI,SAAS,KAAK,SAAS,OAAO,KAAK,SAAS,KAAK;AAOvE,SAAK,iBAAiB;AAOtB,SAAK,YAAY;AAMjB,SAAK,SAAS,IAAI,eAAO;AAOzB,SAAK,OAAO;AAQZ,SAAK,kBAAkB,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,SAAS,cAAc,IAAM;AAAA,IACnC;AAKA,SAAK,iBAAiB,IAAI,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,IACf,CAAC;AAKD,SAAK,YAAY;AAKjB,SAAK,mBAAmB;AAGxB,SAAK,eAAe,IAAI,MAAM,GAAG,GAAG,GAAG,CAAG;AAG1C,SAAK,cAAc,IAAI,MAAM,KAAK,KAAK,KAAK,CAAG;AAG/C,SAAK,mBAAmB,IAAI,SAAS;AAGrC,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,KAAK,UAAU,EAAE;AAAA,EACzB;AAAA,EAEA,IAAI,OAAO,OAAO;AACjB,SAAK,OAAO,KAAK,OAAO,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,KAAK,UAAU,EAAE;AAAA,EACzB;AAAA,EAEA,IAAI,MAAM,OAAO;AAChB,SAAK,OAAO,OAAO,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKT,QAAQ;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKT,QAAQ;AACP,SAAK,eAAe;AACpB,SAAK,aAAa,KAAK,SAAS,SAAS;AACzC,SAAK,SAAS,SAAS;AACvB,SAAK,UAAU;AACf,SAAK,MAAM,MAAM;AACjB,SAAK,eAAe,CAAC,IAAI;AACzB,SAAK,eAAe,CAAC,IAAI;AACzB,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,WAAO,KAAK,aAAa,QAAQ,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,QAAQ;AAChB,WACC,OAAO,QAAQ,KAAK,SACpB,OAAO,SAAS,KAChB,OAAO,OAAO,KAAK,UACnB,OAAO,UAAU;AAAA,EAEnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,QAAQ;AACrB,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,UAAU,OAAO,SAAS,WAAW,OAAO,QAAQ;AACvD,aAAO,QAAQ;AACf,aAAO,SAAS;AAChB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAEzB,mBAAa,KAAK,iBAAiB,OAAO,MAAM;AAAA,IACjD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAaC,UAAS,OAAO;AAC5B,SAAK,aAAa,aAAaA,OAAM;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAAQ;AACrB,SAAK,iBAAiB,KAAK,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,MAAM;AACnB,YAAQ,MAAM,MAAM;AAAA;AAAA,MAEnB,KAAK;AACJ,aAAK;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACD;AACA;AAAA;AAAA,MAGD,KAAK;AAAA,MACL,KAAK;AACJ,aAAK,WAAW,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,QAAQ,IAAI;AACtE;AAAA;AAAA,MAGD,KAAK;AAAA,MACL,KAAK;AACJ,aAAK,cAAc,OAAO,IAAI;AAC9B;AAAA,MAED,KAAK;AACJ,aAAK;AAAA,UACJ,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,UACd;AAAA,QACD;AACA;AAAA;AAAA,MAGD,KAAK;AACJ,aAAK,YAAY,MAAM,GAAG,MAAM,CAAC;AACjC;AAAA,MAED;AACC,cAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAO;AACX,SAAK,OAAO,OAAO,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,KAAK,OAAO,OAAO,YAAY;AACnC,UAAM,aAAa;AAAA,MAClB,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,WAAW,KAAK,SAAS;AAAA,IAC1B;AACA,UAAM,gBAAgB,IAAI;AAAA,MACzB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,IACD;AACA,UAAM,UAAU,cAAc;AAE9B,YAAQ,YAAY,iBAAiB,QAAQ,MAAM,MAAM,IAAI;AAC7D,YAAQ,SAAS,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM;AAE5C,YAAQ,2BAA2B;AACnC,YAAQ,UAAU,KAAK,GAAG,CAAC;AAC3B,YAAQ,2BAA2B;AACnC,YAAQ,UAAU,KAAK,GAAG,CAAC;AAE3B,WAAO,cAAc;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,YAAY;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,QAAQ,MAAMC,SAAQ,KAAK,OAAO;AAEjC,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,YAAY,SAASA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AAEX,SAAK,YAAY,SAAS,GAAK,GAAK,GAAK,CAAG;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAO,aAAa,SAAS;AACnC,WAAO,KAAK,aAAa,OAAO,MAAM,OAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,OAAO,aAAa,SAAS;AAC1C,WAAO,KAAK,aAAa,cAAc,MAAM,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,OAAO,aAAa,SAAS;AACtC,WAAO,KAAK,aAAa,UAAU,MAAM,OAAO;AAAA,EACjD;AACD;;;AC7aA,IAAM,gBAAN,MAAoB;AAAA,EACnB,cAAc;AACb,SAAK,OAAO,oBAAI,IAAI;AAAA,EACrB;AAAA,EACA,IAAI,KAAK,OAAO;AACf,UAAM,MAAM,KAAK,KAAK,IAAI,GAAG;AAC7B,QAAI,KAAK;AACR,UAAI,KAAK,KAAK;AAAA,IACf,OAAO;AACN,WAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,IAC3B;AAAA,EACD;AAAA,EACA,IAAI,KAAK;AACR,WAAO,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAC/B;AAAA,EACA,IAAI,KAAK;AACR,WAAO,KAAK,KAAK,IAAI,GAAG;AAAA,EACzB;AAAA,EACA,OAAO,KAAK;AACX,SAAK,KAAK,OAAO,GAAG;AAAA,EACrB;AAAA,EACA,QAAQ,UAAU;AACjB,SAAK,KAAK,QAAQ,CAAC,QAAQ,QAAQ;AAClC,iBAAW,SAAS,QAAQ;AAC3B,iBAAS,OAAO,GAAG;AAAA,MACpB;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA,QAAQ;AACP,SAAK,KAAK,MAAM;AAAA,EACjB;AACD;;;ACzBO,SAAS,cAAcC,OAAM,cAAc;AACjD,QAAM,QAAQ,CAAC;AAEf,QAAM,SAASA,MAAK;AACpB,aAAW,QAAQ,QAAQ;AAC1B,UAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,UAAM,UAAU,CAAC,CAAC,MAAM;AAExB,QAAI;AAEJ,QAAI,SAAS;AACZ,aAAO;AAAA,QACN,GAAG,MAAM,iBAAiB;AAAA,QAC1B,GAAG,MAAM,iBAAiB;AAAA,QAC1B,GAAG,MAAM,iBAAiB;AAAA,QAC1B,GAAG,MAAM,iBAAiB;AAAA,MAC3B;AAAA,IACD;AAEA,QAAI;AACJ,QAAI;AAEJ,UAAM,wBAAwB,MAAM,cAAc,MAAM;AACxD,QAAI,uBAAuB;AAC1B,gBAAU,MAAM,WAAW,IAAI,MAAM,MAAM,KAAK,UAAU,KAAK,IAAI;AACnE,gBAAU,MAAM,WAAW,IAAI,MAAM,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,IACpE;AAEA,UAAM,IAAI,IAAI;AAAA,MACb;AAAA;AAAA,MACA,SAASA,MAAK,KAAK,SAAS;AAAA;AAAA,MAC5B,QAAQ,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC;AAAA,MACrC,aAAa,wBACV,IAAI,SAAS,UAAU,MAAM,GAAG,UAAU,MAAM,CAAC,IACjD;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM,YAAY,OAAO,CAAC,MAAM;AAAA,IACxC;AACA,iBAAa,OAAO,OAAO,MAAMA,MAAK,KAAK,KAAK,GAAGA,MAAK,KAAK,KAAK,CAAC;AAAA,EACpE;AAEA,QAAM,QAAQ,CAAC;AACf,aAAW,QAAQA,MAAK,KAAK,WAAW;AACvC,UAAM,OAAOA,MAAK,KAAK,UAAU,IAAI;AAErC,UAAM,aAAa,MAAM;AAAA,MACxB,EAAE,QAAQ,KAAK,KAAK,KAAK,OAAO,EAAE;AAAA,MAClC,CAAC,GAAG,MAAM;AACT,eAAO,KAAK,OAAO;AAAA,MACpB;AAAA,IACD;AACA,UAAM,IAAI,IAAI;AAAA,MACb,MAAM,KAAK;AAAA,MACX,OAAO;AAAA;AAAA,MAEP,OAAO,MAAM,WAAW,SAAS;AAAA;AAAA,MAEjC,WAAW,KAAK;AAAA,IACjB;AAAA,EACD;AACA,QAAM,QAAQ;AAEd,SAAO;AACR;;;ACnEO,SAAS,iBAAiBC,OAAM,cAAc;AACpD,QAAM,QAAQ,CAAC;AACf,QAAM,QAAQA,MAAK;AACnB,QAAM,UAAUA,MAAK,WAAW;AAChC,QAAM,SAASA,MAAK,UAAU;AAE9B,MAAI,QAAQ,MAAM;AAClB,MAAI,SAAS,MAAM;AAGnB,QAAM,cAAc,aAAa;AAAA,IAChC,CAAC,GAAG,QAAQ,SAAS,YAAYA,MAAK,aAAa;AAAA,IACnD,CAAC,GAAG,SAAS,SAAS,YAAYA,MAAK,cAAc;AAAA,EACtD;AAGA,MACC,SAASA,MAAK,aAAa,aAAa,KACxC,UAAUA,MAAK,cAAc,aAAa,GACzC;AACD,UAAM,iBAAiB,YAAY,KAAKA,MAAK,aAAa;AAC1D,UAAM,kBAAkB,YAAY,KAAKA,MAAK,cAAc;AAC5D,QACC,iBAAiB,UAAU,WAC3B,kBAAkB,WAAW,SAC5B;AAED,cAAQ;AACR,eAAS;AAET,cAAQ;AAAA,QACP,oCACC,MAAM,MACN,2BACCA,MAAK,aAAa,WACnB,OACCA,MAAK,cAAc,WACpB,oCACA,QACA,MACA;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAGA,WACK,QAAQ,GAAG,QAAQ,YAAY,IAAI,YAAY,GACnD,QAAQ,OACR,SACC;AACD,UAAM,OAAO,KAAK;AAClB,UAAM,IAAI,IAAI;AAAA,MACb;AAAA,MACA,SAAS;AAAA;AAAA,MACT,QAAQ,IAAI;AAAA,QACX,UAAU,UAAUA,MAAK,eAAe,QAAQ,YAAY;AAAA,QAC5D,UAAU,UAAUA,MAAK,eAAe,CAAC,EAAE,QAAQ,YAAY;AAAA,MAChE;AAAA,MACA,aAAaA,MAAK,eAAe;AAAA,MACjC,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAOA,MAAK;AAAA,MACZ,QAAQA,MAAK;AAAA,MACb,OAAO;AAAA,IACR;AACA,iBAAa,OAAO,OAAO,MAAM,OAAO,MAAM;AAAA,EAC/C;AAEA,eAAa,QAAQ,WAAW;AAEhC,SAAO;AACR;;;ACvEO,SAAS,mBAAmBC,OAAM,cAAc;AACtD,QAAM,QAAQ,CAAC;AAEf,EAAAA,MAAK,OAAO,QAAQ,CAAC,UAAU;AAE9B,QAAI,MAAM,eAAe,UAAU,GAAG;AAErC,YAAM,IAAI,MAAM;AAChB,YAAM,UAAU,CAAC,CAAC,MAAM;AAExB,UAAI;AAEJ,UAAI,SAAS;AACZ,eAAO;AAAA,UACN,GAAG,MAAM,iBAAiB;AAAA,UAC1B,GAAG,MAAM,iBAAiB;AAAA,UAC1B,GAAG,MAAM,iBAAiB;AAAA,UAC1B,GAAG,MAAM,iBAAiB;AAAA,QAC3B;AAAA,MACD;AAEA,UAAI;AACJ,UAAI;AAEJ,YAAM,wBAAwB,MAAM,cAAc,MAAM;AACxD,UAAI,uBAAuB;AAC1B,kBAAU,MAAM,WAAW,IAAI,MAAM,MAAM,KAAK,UAAU,KAAK,IAAI;AACnE,kBAAU,MAAM,WAAW,IAAI,MAAM,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,MACpE;AAEA,YAAM,MAAM,QAAQ,IAAI;AAAA,QACvB,MAAM,MAAM;AAAA;AAAA,QACZ,SAASA,MAAK,KAAK,SAAS;AAAA;AAAA,QAC5B,QAAQ,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;AAAA,QAC7B,aAAa,wBACV,IAAI,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,IACzC;AAAA,QACH;AAAA,QACA;AAAA,QACA,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,OAAO,MAAM,YAAY,OAAO,CAAC,MAAM;AAAA,MACxC;AACA,mBAAa;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,QACNA,MAAK,KAAK,KAAK;AAAA,QACfA,MAAK,KAAK,KAAK;AAAA,MAChB;AAAA,IACD;AAAA,EACD,CAAC;AACD,SAAO;AACR;;;AC5CO,SAAS,YACf,OACA,QACA,OAAO,WACP,SAAS,aACR;AACD,SAAO;AAAA,IACN,MAAM;AAAA,MACL,KAAK;AAAA,MACL,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACP;AAAA,QACC,UAAU;AAAA,QACV,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO;AAAA,MAC1C;AAAA,IACD;AAAA,EACD;AACD;AAMO,SAAS,eAAe,KAAK;AACnC,MAAI,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,iBAAiB,GAAG;AACrE,WAAO;AAAA,EACR,WAAW,IAAI,SAAS,SAAS,GAAG;AACnC,WAAO;AAAA,EACR,WAAW,IAAI,SAAS,UAAU,GAAG;AACpC,WAAO;AAAA,EACR,WAAW,IAAI,SAAS,SAAS,GAAG;AACnC,WAAO;AAAA,EACR,OAAO;AACN,UAAM,IAAI,MAAM,mCAAmC,GAAG;AAAA,EACvD;AACD;AAYO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BzB,YAAY,SAAS,KAAKC,QAAO;AAKhC,SAAK,SAAS;AAOd,SAAK,UAAU,oBAAI,IAAI;AAOvB,SAAK,UAAU,oBAAI,IAAI;AAOvB,SAAK,cAAc;AAGnB,QAAI,OAAO,YAAY,aAAa;AAEnC,gBAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACrD,iBAAW,KAAK,SAAS;AACxB,cAAM,QAAQ,QAAQ,CAAC;AAEvB,YAAI,OAAO,MAAM,SAAS,aAAa;AACtC,eAAK,SAAS,eAAe,MAAM,KAAK,GAAG;AAC3C,eAAK,SAAS,MAAM,KAAK,UAAU;AACnC,kBAAQ,KAAK,QAAQ;AAAA,YACpB,KAAK;AAAA,YACL,KAAK;AAEJ,kBAAI,OAAO,QAAQ,aAAa;AAE/B,sBAAM,QAAQ,SAAS,MAAM,KAAK,KAAK;AACvC,oBAAI,CAAC,OAAO;AACX,wBAAM,IAAI,MAAM,oBAAoB,QAAQ,aAAa;AAAA,gBAC1D;AACA,qBAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,KAAK;AAAA,cACzC,OAAO;AACN,qBAAK,QAAQ;AAAA,kBACZ,MAAM,KAAK,SAAS;AAAA,kBACpB,OAAO,QAAQ,WAAW,SAAS,GAAG,IAAI;AAAA,gBAC3C;AAAA,cACD;AAEA,kBAAI,KAAK,WAAW,iBAAiB;AACpC,qBAAK,QAAQ;AAAA,kBACZ,MAAM,KAAK,SAAS;AAAA,kBACpB,mBAAmB,OAAO,IAAI;AAAA,gBAC/B;AAAA,cACD,OAAO;AACN,qBAAK,QAAQ;AAAA,kBACZ,MAAM,KAAK,SAAS;AAAA,kBACpB,cAAc,OAAO,IAAI;AAAA,gBAC1B;AAAA,cACD;AACA;AAAA,YACD,KAAK;AACJ,kBACC,CAAC,MAAM,KAAK,YACZ,CAAC,MAAM,KAAK,SAAS,SAAS,SAAS,GACtC;AACD,sBAAM,IAAI;AAAA,kBACT;AAAA,gBAED;AAAA,cACD;AACA,mBAAK,QAAQ;AAAA,gBACZ;AAAA,gBACA,OAAO,QAAQ,WAAW,SAAS,GAAG,IAAI;AAAA,cAC3C;AAEA,mBAAK,QAAQ;AAAA,gBACZ,MAAM,KAAK,SAAS;AAAA,gBACpB,mBAAmB,OAAO,IAAI;AAAA,cAC/B;AACA;AAAA,YACD,KAAK;AACJ,mBAAK,QAAQ;AAAA,gBACZ;AAAA,gBACA,OAAO,QAAQ,WAAW,SAAS,GAAG,IAAI;AAAA,cAC3C;AAEA,mBAAK,QAAQ;AAAA,gBACZ,MAAM,KAAK,SAAS;AAAA,gBACpB,mBAAmB,OAAO,IAAI;AAAA,cAC/B;AACA;AAAA,YACD;AACC,oBAAM,IAAI;AAAA,gBACT,mCAAmC,MAAM,KAAK;AAAA,cAC/C;AAAA,UACF;AAAA,QACD,OAAO;AAEN,cACC,OAAO,MAAM,eAAe,eAC5B,OAAO,MAAM,gBAAgB,aAC5B;AACD,iBAAK,SAAS;AACd,iBAAK,SAAS;AAEd,gBAAI,OAAO,QAAQ,aAAa;AAE/B,oBAAM,QAAQ,OAAO,QAAQ,WAAW,SAAS,GAAG,IAAI;AAAA,YACzD;AAEA,iBAAK,QAAQ,IAAI,WAAW,iBAAiB,OAAO,IAAI,CAAC;AACzD,iBAAK,QAAQ,IAAI,WAAW,MAAM,KAAK;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AACA,WAAK,cAAc,KAAK,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,IAC/C;AAGA,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACrD;AAGA,QAAIA,WAAU,OAAO;AACpB,WAAK,QAAQ,QAAQ,CAAC,WAAW;AAChC,iBAAS,MAAM,IAAI,QAAQ,IAAI;AAAA,MAChC,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAM;AACd,QAAI,OAAO,SAAS,UAAU;AAC7B,aAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,IAC7B,OAAO;AACN,aAAO,KAAK,QAAQ,IAAI,KAAK,WAAW;AAAA,IACzC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAQ;AAClB,QAAI,OAAO,WAAW,YAAY,OAAO,OAAO,YAAY,UAAU;AACrE,aAAO,KAAK,QAAQ,IAAI,OAAO,OAAO;AAAA,IACvC,OAAO;AACN,aAAO,KAAK,QAAQ,IAAI,KAAK,WAAW;AAAA,IACzC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,MAAM,GAAG,GAAG,GAAG,GAAG;AAE3B,QAAI,SAAS,SAAS,YAAY,MAAM;AACvC,cAAQ,KAAK,yBAAyB,MAAM,eAAe,IAAI;AAAA,IAChE;AAEA,UAAM,SAAS,KAAK,WAAW;AAC/B,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAElB,UAAM,IAAI,IAAI;AAAA,MACb;AAAA,MACA,QAAQ,IAAI,SAAS,GAAG,CAAC;AAAA,MACzB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAEA,SAAK,OAAO,OAAO,MAAM,IAAI,EAAE;AAE/B,WAAO,MAAM,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAAM,OAAO;AACtB,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC9B,eAAS,KAAK,SAAS,KAAK,EAAE,IAAI;AAAA,IACnC,OAAO;AAEN,iBAAWC,UAAS,KAAK,QAAQ,OAAO,GAAG;AAC1C,YAAI,OAAOA,OAAM,IAAI,MAAM,aAAa;AAEvC,mBAASA,OAAM,IAAI;AACnB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAM;AAEZ,QAAI,SAAS,KAAK,UAAU,IAAI;AAEhC,QAAI,OAAO,WAAW,aAAa;AAElC,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,YAAM,KAAK,CAAC,KAAK,CAAC;AAClB,YAAM,KAAK,CAAC,KAAK,CAAC;AAClB,YAAM,KAAK,CAAC,KAAK,CAAC;AAClB,YAAM,KAAK,CAAC,KAAK,CAAC;AAClB,eAAS,KAAK,UAAU,MAAM,IAAI,IAAI,IAAI,EAAE;AAAA,IAC7C;AACA,WAAO,OAAO;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAO,MAAM,GAAG,GAAG;AAEzB,QAAI,OAAO,SAAS,OAAO,aAAa;AAEvC,YAAM,IAAI,MAAM,IAAI,EAAE;AACtB,YAAM,KAAK,MAAM,IAAI,EAAE;AACvB,YAAM,KAAK,MAAM,IAAI,EAAE;AAEvB,YAAM,IAAI,EAAE,MAAM,IAAI,aAAa;AAAA,QAClC,EAAE,IAAI;AAAA;AAAA,QACN,EAAE,IAAI;AAAA;AAAA,SACL,EAAE,IAAI,MAAM;AAAA;AAAA,SACZ,EAAE,IAAI,MAAM;AAAA;AAAA,MACd,CAAC;AAGD,YAAM,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,MAAM;AAC9C,YAAM,GAAG,IAAI,MAAM,IAAI;AAAA,IACxB;AACA,WAAO,MAAM,IAAI,EAAE;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,qBAAqB,MAAM,UAAU,YAAY,OAAO;AAEvD,WAAO,oBAAK;AAAA,MACX,cAAc,OAAO,uBAAuB;AAAA,MAC5C;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN;AAAA,UACC,OAAO;AAAA,UACP,QAAQ;AAAA,QACT;AAAA,QACA,YAAY,CAAC;AAAA,MACd;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,wBAAwB,OAAO,UAAU;AACxC,UAAM,UAAU,CAAC;AACjB,UAAM,UAAU,CAAC;AACjB,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,UAAM,eAAe,KAAK,SAAS;AAInC,QAAI,OAAO,UAAU,aAAa;AACjC,cAAQ;AAAA,IACT;AAEA,eAAW,KAAK,OAAO;AACtB,YAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI;AAC/C,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAI,UAAU,MAAM;AAEnB,cAAM,IAAI,MAAM,0BAA0B,OAAO,YAAY;AAAA,MAC9D;AACA,cAAQ,KAAK,MAAM;AAEnB,cAAQ,IAAI,IAAI,QAAQ,SAAS;AAEjC,cAAQ,KAAK,IAAI,OAAO,OAAO,KAAK;AACpC,eAAS,KAAK,IAAI,OAAO,QAAQ,MAAM;AAAA,IACxC;AAGA,WAAO,IAAI;AAAA,MACV;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACN;AAAA,UACC,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,OAAO,aAAa;AAAA,UACpB,cAAc;AAAA,QACf;AAAA,QACA,YAAY,CAAC;AAAA,MACd;AAAA,IACD;AAAA,EACD;AACD;;;ACteA,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIlB,YAAY,WAAW,UAAU;AAEhC,SAAK,QAAQ,IAAI,cAAc;AAC/B,SAAK,SAAS,oBAAI,IAAI;AACtB,SAAK,QAAQ,oBAAI,IAAI;AACrB,SAAK,YAAY,oBAAI,IAAI;AACzB,SAAK,WAAW;AAChB,SAAK,MAAM;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,SAAK,MAAM,MAAM;AACjB,SAAK,OAAO,MAAM;AAClB,SAAK,MAAM,MAAM;AACjB,SAAK,UAAU,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB;AAErB,aAAS,OAAO,GAAG,OAAO,KAAK,UAAU,QAAQ;AAEhD,UAAI,CAAC,KAAK,UAAU,IAAI,IAAI,GAAG;AAE9B,aAAK,UAAU,IAAI,IAAI;AAEvB,eAAO;AAAA,MACR;AAAA,IACD;AAIA,UAAM,IAAI;AAAA,MACT,6BACC,KAAK,WACL;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAS;AACxB,UAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ,WAAW;AACtD,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,OAAO,SAAS,aAAa;AAChC,WAAK,UAAU,OAAO,MAAM;AAC5B,WAAK,MAAM,OAAO,MAAM;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAS;AAChB,UAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ,WAAW;AACtD,QAAI,CAAC,KAAK,MAAM,IAAI,MAAM,GAAG;AAC5B,WAAK,MAAM,IAAI,QAAQ,KAAK,oBAAoB,CAAC;AAAA,IAClD;AACA,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAO,cAAc;AACxB,UAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,UAAM,SAAS,MAAM,UAAU,MAAM;AAGrC,QACC,SAAS,iBAAiB,MACzB,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,MAAM,IAC5C;AACD,YAAM,MAAM,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAC3D,cAAQ;AAAA,QACP,eACC,MACA,4BAEA,QACA,MACA,SACA;AAAA,MACF;AAAA,IACD;AACA,WAAO,KAAK,MAAM,IAAI,OAAO,YAAY;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAO,OAAO;AACjB,QAAI,QAAQ,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;AAEnC,QAAI,OAAO,UAAU,eAAe,OAAO,UAAU,aAAa;AACjE,WAAK,MAAM,QAAQ,CAAC,OAAO,QAAQ;AAClC,cAAM,SAAS,MAAM,SAAS;AAC9B,YACC,QAAQ,SACR,OAAO,UAAU,MAAM,cACvB,OAAO,WAAW,MAAM,aACvB;AACD,kBAAQ;AAAA,QACT;AAAA,MACD,CAAC;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,aAAa;AACjC,UAAI,CAAC,OAAO;AACX,gBAAQ;AAAA,UACP,MAAM,SAAS,MAAM;AAAA,UACrB,MAAM,UAAU,MAAM;AAAA,UACtB,MAAM,MAAM,YAAY,MAAM,GAAG,IAAI;AAAA,QACtC;AAAA,MACD;AACA,cAAQ,IAAI,aAAa,OAAO,OAAO,KAAK;AAC5C,WAAK,IAAI,OAAO,KAAK;AAAA,IACtB;AAGA,QAAI,OAAO,MAAM,YAAY,eAAe,MAAM,QAAQ,OAAO,GAAG;AAEnE,iBAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,QAAQ,GAAG;AAEnD,YAAI,UAAU,OAAO;AACpB,gBAAM,cAAc;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AACb,QAAI,KAAK,MAAM,IAAI,KAAK,GAAG;AAC1B,YAAM,UAAU,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;AACvC,UAAI,OAAO,YAAY,aAAa;AACnC,aAAK,gBAAgB,OAAO;AAAA,MAC7B;AACA,WAAK,MAAM,OAAO,KAAK;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,KAAK,OAAO;AAEhB,QAAI,cAAc,KAAK,OAAO,IAAI,GAAG;AAErC,QAAI,gBAAgB,QAAW;AAC9B,oBAAc,KAAK,OAAO,IAAI,KAAK,oBAAI,IAAI,CAAC;AAAA,IAC7C;AAEA,QAAI,CAAC,YAAY,IAAI,KAAK,GAAG;AAC5B,kBAAY,IAAI,OAAO,SAAS,KAAK,KAAK,OAAO,UAAU,CAAC;AAAA,IAC7D;AAEA,WAAO,YAAY,IAAI,KAAK;AAAA,EAC7B;AACD;AACA,IAAO,gBAAQ;;;ACpKf,IAAqB,iBAArB,cAA4C,SAAS;AAAA;AAAA;AAAA;AAAA,EAIpD,YAAY,SAAS;AAEpB,UAAM,OAAO;AAEb,SAAK,aAAa,KAAK,SAAS,SAAS;AAGzC,SAAK,SAAS,KAAK,YAAY;AAG/B,SAAK,QAAQ,IAAI,cAAa;AAE9B,QAAI,KAAK,SAAS,mBAAmB,SAAS,CAAC,KAAK,SAAS,WAAW;AAEvE,WAAK,WAAW;AAAA,IACjB;AAGA,SAAK,OAAO;AAGZ,SAAK,UAAU,EAAE;AAAA,MAChB;AAAA,MACA,CAAC,MAAM;AACN,UAAE,eAAe;AACjB,aAAK,iBAAiB;AACtB,qBAAa,KAAK,gBAAgB,IAAI;AAAA,MACvC;AAAA,MACA;AAAA,IACD;AAEA,SAAK,UAAU,EAAE;AAAA,MAChB;AAAA,MACA,MAAM;AACL,aAAK,iBAAiB;AACtB,qBAAa,KAAK,oBAAoB,IAAI;AAAA,MAC3C;AAAA,MACA;AAAA,IACD;AAGA,iBAAa,YAAY,YAAY,MAAM;AAC1C,WAAK,MAAM;AAAA,IACZ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,UAAM,MAAM;AACZ,SAAK,WAAW,KAAK,cAAc,KAAK,SAAS,gBAAgB,IAAI;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAChB,SAAK,WAAW,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAa,OAAO,UAAU,SAAS;AACtC,cAAU,WAAW,KAAK,WAAW;AACrC,SAAK,mBAAmB;AACxB,YAAQ,MAAM;AAAA,MACb,KAAK;AACJ,gBAAQ,2BAA2B;AACnC;AAAA,MAED,KAAK;AAAA,MACL,KAAK;AACJ,gBAAQ,2BAA2B;AACnC;AAAA,MAED,KAAK;AACJ,gBAAQ,2BAA2B;AACnC;AAAA,MAED;AACC,gBAAQ,2BAA2B;AACnC,aAAK,mBAAmB;AACxB;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,QAAI,KAAK,gBAAgB,QAAQ,GAAG;AACnC,WAAK,WAAW,KAAK,eAAe;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAQ,WAAW,SAAS,OAAO;AAC7C,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,UAAU,KAAK,WAAW;AAEhC,SAAK,KAAK;AACV,SAAK,eAAe;AACpB,YAAQ,cAAc;AACtB,YAAQ,2BAA2B,WAAW,OAAO,SAAS;AAC9D,YAAQ,YAAY,iBAAiB,QAAQ,MAAM,OAAO,IAAI;AAC9D,SAAK,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,GAAG,GAAG,OAAO,QAAQ;AAC9B,SAAK,WAAW,EAAE,UAAU,GAAG,GAAG,OAAO,MAAM;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAc,OAAO,QAAQ;AAC5B,WAAO,KAAK,WAAW,EAAE,cAAc,OAAO,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,UAAU,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAChD,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAEhC,QAAI,OAAO,OAAO,aAAa;AAC9B,WAAK,KAAK,MAAM;AAChB,WAAK,KAAK,MAAM;AAChB,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK;AAAA,IACN,WAAW,OAAO,OAAO,aAAa;AACrC,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK,MAAM;AACX,WAAK,MAAM;AACX,WAAK;AACL,WAAK;AAAA,IACN;AAEA,QAAI,KAAK,SAAS,aAAa,OAAO;AAErC,WAAK,CAAC,CAAC;AACP,WAAK,CAAC,CAAC;AAAA,IACR;AAGA,QAAI,SAAS;AACb,UAAM,OAAO,KAAK,YAAY,QAAQ;AACtC,QAAI,KAAK,CAAC,MAAM,KAAO,KAAK,CAAC,MAAM,KAAO,KAAK,CAAC,MAAM,GAAK;AAE1D,eAAS,KAAK,MAAM,KAAK,OAAO,KAAK,YAAY,MAAM,CAAC;AAAA,IACzD;AACA,YAAQ,UAAU,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,SAAS,GAAG,GAAG,OAAO,QAAQ;AACzC,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,YAAY,QAAQ;AAC1B,YAAQ,YAAY;AACpB,YAAQ,SAAS,GAAG,GAAG,OAAO,MAAM;AACpC,YAAQ,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,YAAY;AACX,SAAK,WAAW,EAAE,UAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG,GAAG;AACZ,SAAK,WAAW,EAAE,OAAO,GAAG,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG,GAAG;AACZ,SAAK,WAAW,EAAE,OAAO,GAAG,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,GAAG,GAAG,OAAO,QAAQ;AACzB,SAAK,WAAW,EAAE,KAAK,GAAG,GAAG,OAAO,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,GAAG,GAAG,OAAO,QAAQ,OAAO;AACrC,SAAK,WAAW,EAAE,UAAU,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,MAAM;AACnB,QAAI,OAAO,UAAU,aAAa;AACjC,UAAI,SAAS,MAAM;AAClB,aAAK,WAAW,EAAE,KAAK;AAAA,MACxB,OAAO;AACN,aAAK,WAAW,EAAE,OAAO;AAAA,MAC1B;AAAA,IACD,OAAO;AACN,YAAM,OAAO,OAAO,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAO;AACX,SAAK,OAAO,OAAO,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACX,SAAK,WAAW,EAAE,UAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAG,GAAG,QAAQ,OAAO,KAAK,eAAe,OAAO,OAAO;AAChE,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAEhC,YAAQ,UAAU,GAAG,CAAC;AACtB,YAAQ,UAAU;AAClB,YAAQ,IAAI,GAAG,GAAG,QAAQ,OAAO,KAAK,iBAAiB,KAAK;AAC5D,YAAQ,SAAS,OAAO,SAAS,QAAQ,EAAE;AAC3C,YAAQ,UAAU,CAAC,GAAG,CAAC,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,GAAG,GAAG,QAAQ,OAAO,KAAK,eAAe;AAChD,SAAK,UAAU,GAAG,GAAG,QAAQ,OAAO,KAAK,iBAAiB,OAAO,IAAI;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AACvC,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAEhC,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AAEf,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,IAAI;AAEjB,YAAQ,UAAU;AAClB,YAAQ,OAAO,GAAG,EAAE;AACpB,YAAQ,cAAc,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC;AAC/C,YAAQ,cAAc,IAAI,MAAM,MAAM,IAAI,GAAG,EAAE;AAC/C,YAAQ,cAAc,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC;AAC/C,YAAQ,cAAc,IAAI,MAAM,MAAM,IAAI,GAAG,EAAE;AAC/C,YAAQ,SAAS,OAAO,SAAS,QAAQ,EAAE;AAC3C,YAAQ,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,GAAG,GAAG,GAAG,GAAG;AACvB,SAAK,cAAc,GAAG,GAAG,GAAG,GAAG,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,QAAQ,QAAQ,MAAM,MAAM;AACtC,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AAEA,UAAM,UAAU,KAAK,WAAW;AAEhC,YAAQ,UAAU;AAClB,YAAQ,OAAO,QAAQ,MAAM;AAC7B,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,QAAQ,QAAQ,MAAM,MAAM;AACpC,SAAK,WAAW,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAM,OAAO,OAAO;AACjC,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,OAAO;AAC5B,UAAM,aAAa,OAAO,CAAC;AAE3B,SAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAErC,YAAQ,UAAU;AAClB,YAAQ,OAAO,WAAW,GAAG,WAAW,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACtC,YAAM,QAAQ,OAAO,CAAC;AACtB,cAAQ,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,IAChC;AACA,YAAQ,OAAO,WAAW,GAAG,WAAW,CAAC;AACzC,YAAQ,SAAS,OAAO,SAAS,QAAQ,EAAE;AAC3C,YAAQ,UAAU;AAElB,SAAK,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,MAAM;AACjB,SAAK,cAAc,MAAM,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAW,GAAG,GAAG,OAAO,QAAQ,OAAO,OAAO;AAC7C,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAEhC,YAAQ,SAAS,OAAO,aAAa,YAAY,EAAE,GAAG,GAAG,OAAO,MAAM;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,GAAG,GAAG,OAAO,QAAQ;AAC7B,SAAK,WAAW,GAAG,GAAG,OAAO,QAAQ,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBAAgB,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAC1D,QAAI,KAAK,eAAe,IAAI,IAAI,KAAK;AAEpC;AAAA,IACD;AACA,UAAM,UAAU,KAAK,WAAW;AAEhC,YAAQ,UAAU;AAClB,YAAQ,UAAU,GAAG,GAAG,OAAO,QAAQ,MAAM;AAC7C,YAAQ,SAAS,OAAO,SAAS,QAAQ,EAAE;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,GAAG,GAAG,OAAO,QAAQ,QAAQ;AAC1C,SAAK,gBAAgB,GAAG,GAAG,OAAO,QAAQ,QAAQ,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,GAAG,GAAG;AACjB,SAAK,WAAW,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,GAAG,GAAG;AACf,SAAK,YAAY,GAAG,CAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAAU;AACT,UAAM,SAAS,KAAK,UAAU;AAC9B,SAAK,WAAW,EAAE,QAAQ;AAC1B,SAAK,aAAa,QAAQ,CAAC,IAAI,KAAK,eAAe;AACnD,SAAK,eAAe,CAAC,IAAI;AACzB,SAAK,eAAe,CAAC,IAAI;AACzB,SAAK,eAAe,CAAC,IAAI,OAAO;AAChC,SAAK,eAAe,CAAC,IAAI,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO;AACN,SAAK,WAAW,EAAE,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,OAAO;AACb,SAAK,WAAW,EAAE,OAAO,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAG,GAAG;AACX,SAAK,WAAW,EAAE,MAAM,GAAG,CAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAO;AACf,UAAM,eAAe,KAAK;AAC1B,UAAM,UAAU,KAAK,WAAW;AAEhC,iBAAa,KAAK,KAAK;AAGvB,YAAQ,cAAc,QAAQ,YAAY,aAAa,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAeC,QAAO;AACrB,SAAK,WAAW,EAAE,cAAcA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAChB,WAAO,KAAK,WAAW,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAAY;AACf,WAAO,KAAK,WAAW,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU,OAAO;AACpB,SAAK,WAAW,EAAE,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACd,WAAO,KAAK,WAAW,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS,OAAO;AACnB,UAAM,UAAU,KAAK,WAAW;AAChC,YAAQ,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC9B,SAAK,eAAe;AACpB,SAAK,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC3B,QAAI,OAAO,MAAM,UAAU;AAC1B,YAAM,IAAI,EAAE,QAAQ;AACpB,UAAI,EAAE,CAAC;AACP,UAAI,EAAE,CAAC;AACP,UAAI,EAAE,CAAC;AACP,UAAI,EAAE,CAAC;AACP,UAAI,EAAE,CAAC;AACP,UAAI,EAAE,CAAC;AAAA,IACR;AAGA,QAAI,KAAK,SAAS,aAAa,OAAO;AACrC,WAAK;AACL,WAAK;AAAA,IACN;AAEA,SAAK,WAAW,EAAE,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAG,GAAG;AACf,QAAI,KAAK,SAAS,aAAa,OAAO;AACrC,WAAK,WAAW,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,IACrC,OAAO;AACN,WAAK,WAAW,EAAE,UAAU,GAAG,CAAC;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,GAAG,GAAG,OAAO,QAAQ;AAC7B,UAAM,SAAS,KAAK,UAAU;AAE9B,QACC,MAAM,KACN,MAAM,KACN,UAAU,OAAO,SACjB,WAAW,OAAO,QACjB;AACD,YAAM,iBAAiB,KAAK;AAE5B,UACC,eAAe,CAAC,MAAM,KACtB,eAAe,CAAC,MAAM,KACtB,eAAe,CAAC,MAAM,SACtB,eAAe,CAAC,MAAM,QACrB;AACD,cAAM,UAAU,KAAK,WAAW;AAChC,gBAAQ,UAAU;AAClB,gBAAQ,KAAK,GAAG,GAAG,OAAO,MAAM;AAChC,gBAAQ,KAAK;AAEb,uBAAe,CAAC,IAAI;AACpB,uBAAe,CAAC,IAAI;AACpB,uBAAe,CAAC,IAAI;AACpB,uBAAe,CAAC,IAAI;AAAA,MACrB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,MAAM,SAAS,OAAO;AAC7B,UAAM,UAAU,KAAK,WAAW;AAEhC,QAAI,KAAK,cAAc,GAAG;AAEzB,cAAQ,KAAK;AACb,UAAI,OAAO,SAAS,aAAa;AAChC,gBAAQ,UAAU;AAAA,MACnB;AAAA,IAED;AAEA,QAAI,OAAO,SAAS,aAAa;AAChC,cAAQ,KAAK,MAAM;AAAA;AAAA,QAElB,KAAK;AACJ,kBAAQ;AAAA,YACP,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,UACN;AACA;AAAA;AAAA,QAGD,KAAK;AAAA,QACL,KAAK;AACJ,kBAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM;AACzD;AAAA;AAAA,QAGD,KAAK;AACJ;AAEC,kBAAM,KAAK,KAAK,IAAI;AACpB,kBAAM,KAAK,KAAK,IAAI;AACpB,oBAAQ,OAAO,KAAK,KAAK,OAAO,CAAC,EAAE,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;AAC3D,qBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC5C,oBAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,sBAAQ,OAAO,KAAK,MAAM,GAAG,KAAK,MAAM,CAAC;AAAA,YAC1C;AAAA,UACD;AACA;AAAA,QAED,KAAK;AACJ;AACC,kBAAM,KAAK,KAAK,IAAI;AACpB,kBAAM,KAAK,KAAK,IAAI;AACpB,kBAAM,KAAK,KAAK,QAAQ;AACxB,kBAAM,KAAK,KAAK,QAAQ;AACxB,kBAAM,KAAK,KAAK;AAChB,kBAAM,KAAK,KAAK;AAChB,kBAAM,KAAK,KAAK;AAChB,kBAAM,KAAK,KAAK;AAEhB,kBAAM,SAAS,KAAK;AACpB,kBAAM,SAAS,KAAK;AACpB,kBAAM,OAAO,KAAK;AAClB,kBAAM,OAAO,KAAK;AAClB,kBAAM,OAAO,KAAK;AAClB,kBAAM,OAAO,KAAK;AAElB,oBAAQ,OAAO,IAAI,EAAE;AACrB,oBAAQ,cAAc,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAChD,oBAAQ,cAAc,IAAI,MAAM,MAAM,IAAI,IAAI,EAAE;AAChD,oBAAQ,cAAc,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAChD,oBAAQ,cAAc,IAAI,MAAM,MAAM,IAAI,IAAI,EAAE;AAAA,UACjD;AACA;AAAA,QAED;AACC,gBAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,IACD;AAEA,SAAK;AAEL,QAAI,WAAW,MAAM;AACpB,cAAQ,UAAU;AAClB,cAAQ,2BAA2B;AACnC,cAAQ,KAAK;AAAA,IACd,OAAO;AACN,cAAQ,KAAK;AAAA,IACd;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,QAAI,KAAK,YAAY,GAAG;AACvB,WAAK,YAAY;AACjB,WAAK,WAAW,EAAE,QAAQ;AAAA,IAC3B;AAAA,EACD;AACD;;;ACj5BA,IAAqB,OAArB,cAAkC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxC,YAAY,GAAG,GAAG,KAAK,SAAS;AAC/B,QAAI;AACJ,QAAI;AAGJ,UAAM;AAGN,QAAI,QAAQ,cAAc;AACzB,YAAM,QAAQ,QAAQ,aAAa,MAAM,kBAAkB;AAC3D,cAAQ,MAAM;AACd,eAAS,MAAM;AAAA,IAChB,OAAO;AACN,cAAQ,QAAQ;AAChB,eAAS,QAAQ;AAAA,IAClB;AAEA,SAAK,UAAU,GAAG,GAAG,OAAO,MAAM;AAMlC,SAAK,UAAU;AAMf,SAAK,mBAAmB;AAGxB,SAAK,MAAM;AACX,SAAK,MAAM;AAMX,SAAK,SAAS;AAMd,SAAK,YAAY,KAAK,SAAS,gBAAgB;AAM/C,SAAK,YAAY,KAAK,SAAS,gBAAgB;AAM/C,SAAK,aAAa,KAAK,SAAS,iBAAiB;AAMjD,SAAK,UAAU,KAAK,YAAY,KAAK,YAAY,KAAK;AAGtD,QAAI,KAAK,YAAY,MAAM;AAC1B,UAAI,KAAK,qBAAqB,MAAM;AACnC,aAAK,mBAAmB,IAAI,SAAS;AAAA,MACtC;AACA,WAAK,iBAAiB,KAAK,iBAAiB,SAAS,CAAC;AAAA,IACvD;AAGA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,WAAW;AAC3B,cAAU,UAAU,KAAK,QAAQ,GAAG,KAAK,SAAS,CAAC;AACnD,QAAI,KAAK,WAAW;AACnB,gBAAU,OAAQ,MAAM,KAAK,KAAM,GAAG;AACtC,gBAAU,MAAM,IAAI,CAAC;AAAA,IACtB;AACA,QAAI,KAAK,UAAU;AAClB,gBAAU,MAAM,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,KAAK,CAAC;AAAA,IACjE;AACA,QAAI,KAAK,UAAU;AAClB,gBAAU,MAAM,KAAK,YAAY,KAAK,GAAG,KAAK,YAAY,IAAI,EAAE;AAAA,IACjE;AACA,cAAU,UAAU,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,SAAS,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,UAAU;AACvB,QAAI;AACJ,UAAM,UAAU,KAAK;AAErB,QAAI,QAAQ,WAAW,IAAI,KAAK,MAAM,GAAG;AACxC,YAAM,SAAS,CAAC;AAChB,YAAM,UAAU,CAAC;AACjB,cAAQ,WAAW,IAAI,KAAK,MAAM,EAAE,OAAO,QAAQ,CAAC,UAAU;AAC7D,gBAAQ,KAAK,MAAM,MAAM;AACzB,eAAO,KAAK;AAAA,UACX,MAAM,KAAK,MAAM;AAAA,UACjB,OAAO,MAAM;AAAA,QACd,CAAC;AAAA,MACF,CAAC;AACD,mBAAa,QAAQ,QAAQ,wBAAwB,SAAS,QAAQ;AACtE,iBAAW,aAAa,KAAK,SAAS,QAAQ,UAAU,MAAM;AAC9D,iBAAW,oBAAoB,KAAK,SAAS,QAAQ,QAAQ;AAAA,IAC9D,OAAO;AACN,UAAI,QAAQ,iBAAiB,MAAM;AAClC,cAAM,QAAQ,QAAQ,aAAa,KAAK,MAAM;AAC9C,qBAAa,IAAI;AAAA,UAChB;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,YACb;AAAA,UACD,CAAC;AAAA;AAAA,QACF;AACA,mBAAW,YAAY,IAAI,GAAG,CAAC;AAC/B,mBAAW;AAAA,UACV,SAAS,QAAQ,KAAK;AAAA,UACtB,SAAS,SAAS,KAAK;AAAA,QACxB;AACA,YAAI,OAAO,SAAS,aAAa,aAAa;AAC7C,qBAAW,YAAY,IAAI,KAAK,GAAG;AACnC,qBAAW,iBAAiB,OAAO,SAAS,QAAQ;AACpD,qBAAW,iBAAiB;AAAA,YAC3B,SAAS,QAAQ;AAAA,YACjB,SAAS,SAAS;AAAA,UACnB;AAEA,mBAAS,WAAW;AAAA,QACrB;AAAA,MACD,OAAO;AACN,qBAAa,QAAQ,QAAQ;AAAA,UAC5B,KAAK,SAAS,QAAQ;AAAA,UACtB;AAAA,QACD;AACA,mBAAW,YAAY,IAAI,GAAG,CAAC;AAAA,MAChC;AAAA,IACD;AAGA,SAAK,iBAAiB,WAAW,gBAAgB;AAEjD,WAAO;AAAA,EACR;AACD;;;ACjLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,IAAI;AAMJ,SAAS,YAAY,MAAM,MAAM,OAAO;AACvC,MAAI;AAEJ,MAAI,OAAO,UAAU,UAAU;AAE9B,WAAO;AAAA,EACR;AAEA,UAAQ,MAAM;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACJ,cAAQ,OAAO,KAAK;AACpB;AAAA,IAED,KAAK;AACJ,cAAQ,UAAU;AAClB;AAAA,IAED;AAEC,UAAI,CAAC,SAAS,UAAU,KAAK,GAAG;AAE/B,gBAAQ,QAAQ,UAAU,SAAS;AAAA,MACpC,WAAW,UAAU,KAAK,GAAG;AAE5B,gBAAQ,OAAO,KAAK;AAAA,MACrB,WAAW,MAAM,OAAO,SAAS,MAAM,GAAG;AAEzC,gBAAQ,MAAM,MAAM,SAAS,EAAE,CAAC;AAChC,YAAI;AACH,kBAAQ,KAAK,MAAM,KAAK;AAAA,QACzB,QAAQ;AACP,gBAAM,IAAI,MAAM,2BAA2B,KAAK;AAAA,QACjD;AAAA,MACD,WAAW,MAAM,OAAO,SAAS,MAAM,GAAG;AAEzC,gBAAQ,MAAM,MAAM,SAAS,EAAE,CAAC;AAChC,YAAI;AAEH,kBAAQ,SAAS,0BAA0B,QAAQ,GAAG,EAAE;AAAA,QACzD,QAAQ;AACP,gBAAM,IAAI,MAAM,yBAAyB,KAAK;AAAA,QAC/C;AAAA,MACD,YACE,QAAQ,MAAM,MAAM,gCAAgC,OACpD,QAAQ,MAAM,MAAM,mCAAmC,IACvD;AACD,gBAAQ,MAAM,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,MACjC;AAGA,UAAI,KAAK,OAAO,uBAAuB,MAAM,GAAG;AAE/C,YAAI,OAAO,UAAU,UAAU;AAC9B,kBAAQ;AAAA,YACP,GAAG;AAAA,YACH,GAAG;AAAA,UACJ;AAAA,QACD;AAAA,MACD;AAAA,EACF;AAEA,SAAO;AACR;AAKA,SAAS,gBAAgB,KAAK,KAAK;AAElC,MAAI,IAAI,cAAc,IAAI,WAAW,SAAS,GAAG;AAChD,aAAS,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,KAAK;AAC/C,YAAM,YAAY,IAAI,WAAW,KAAK,CAAC;AACvC,UAAI,OAAO,UAAU,SAAS,aAAa;AAE1C,YAAI,UAAU,IAAI,IAAI,UAAU;AAAA,MACjC,OAAO;AAEN,YAAI,UAAU,QAAQ,IAAI,UAAU;AAAA,MACrC;AAAA,IACD;AAAA,EACD;AACD;AAMA,SAAS,UAAU,KAAK,MAAM;AAC7B,QAAM,WAAW,KAAK;AAEtB,UAAQ,UAAU;AAAA,IACjB,KAAK,QAAQ;AACZ,YAAMC,QAAO,MAAM,IAAI;AAEvB,MAAAA,MAAK,WAAWA,MAAK,YAAY;AAGjC,UAAI,OAAOA,MAAK,WAAW,aAAa;AACvC,YAAI,SAAS,IAAI,UAAU,CAAC;AAE5B,QAAAA,MAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,cAAI,OAAO,KAAK;AAAA,YACf,GAAG,CAAC,MAAM;AAAA,YACV,GAAG,CAAC,MAAM;AAAA;AAAA,YAEV,OAAO,CAAC,MAAM;AAAA;AAAA,YAEd,QAAQ,CAAC,MAAM;AAAA,YACf,MAAM,OAAO,MAAM,MAAMA,MAAK,UAAUA,MAAK,WAAW;AAAA,UACzD,CAAC;AAAA,QACF,CAAC;AACD,YAAI,WAAW;AAAA,MAChB;AAEA,UACC,OAAOA,MAAK,SAAS,eACrB,OAAO,IAAI,WAAW,aACrB;AAED,YAAI,OAAO,OAAOA,MAAK,MAAMA,MAAK,UAAUA,MAAK,WAAW;AAC5D,YAAI,WAAW;AAAA,MAChB;AACA;AAAA,IACD;AAAA,IACA,KAAK;AACJ,UAAI,SAAS,IAAI,UAAU,CAAC;AAC5B,UAAI,OAAO,KAAK,MAAM,IAAI,CAAC;AAC3B;AAAA,IAED,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,SAAS;AACb,YAAM,QAAQ,MAAM,IAAI;AACxB,YAAM,OAAO,aAAa,UAAU,cAAc;AAClD,UAAI,MAAM,OAAO;AAChB,cAAM,QAAQ,MAAM,MAAM;AAAA,MAC3B;AAEA,UAAI,SAAS,IAAI,UAAU,CAAC;AAC5B,UAAI,OAAO,KAAK,KAAK;AACrB;AAAA,IACD;AAAA,IACA,KAAK;AACJ,UAAI,YAAY,MAAM,IAAI,EAAE;AAC5B;AAAA,IAED,KAAK;AAAA,IACL,KAAK,UAAU;AACd,YAAM,OAAO,WAAW;AACxB,UAAI,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC;AAC1B,UAAI,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC;AAC1B;AAAA,IACD;AAAA,IACA,KAAK,QAAQ;AACZ,YAAM,OAAO,MAAM,IAAI;AACvB,UAAI,KAAK,OAAO;AACf,aAAK,aAAa,KAAK,MAAM;AAC7B,aAAK,cAAc,KAAK,MAAM;AAC9B,aAAK,QAAQ,KAAK,MAAM;AAAA,MACzB;AACA,UAAI,QAAQ,IAAI,SAAS,CAAC;AAC1B,UAAI,MAAM,KAAK,EAAE,IAAI;AACrB;AAAA,IACD;AAAA,IACA,KAAK,WAAW;AACf,YAAM,UAAU,MAAM,IAAI;AAC1B,UAAI,QAAQ,OAAO;AAClB,gBAAQ,aAAa,QAAQ,MAAM;AACnC,gBAAQ,cAAc,QAAQ,MAAM;AACpC,gBAAQ,QAAQ,QAAQ,MAAM;AAAA,MAC/B;AAEA,UAAI,WAAW,IAAI,YAAY,CAAC;AAChC,UAAI,SAAS,KAAK,OAAO;AACzB;AAAA,IACD;AAAA,IACA,KAAK;AAAA,IACL,KAAK,YAAY;AAChB,UAAI,QAAQ,IAAI,CAAC;AAGjB,YAAM,SAAS,MAAM,IAAI,EAAE,OAAO,MAAM,GAAG;AAG3C,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,cAAM,IAAI,OAAO,CAAC,EAAE,MAAM,GAAG;AAC7B,YAAI,QAAQ,EAAE,KAAK;AAAA,UAClB,GAAG,CAAC,EAAE,CAAC;AAAA,UACP,GAAG,CAAC,EAAE,CAAC;AAAA,QACR,CAAC;AAAA,MACF;AAEA;AAAA,IACD;AAAA,IACA,KAAK;AACJ,UAAI,aAAa,MAAM,IAAI;AAC3B;AAAA,IAED,KAAK,YAAY;AAChB,YAAM,WAAW,MAAM,IAAI;AAE3B,YAAM,QACL,OAAO,SAAS,UAAU,cAAc,SAAS,QAAQ,SAAS;AAEnE,UAAI,SAAS,IAAI,IAAI;AAAA,QACpB,SAAS;AAAA;AAAA,QAET,SAAS,QAAQ;AAAA,QACjB;AAAA,MACD;AACA;AAAA,IACD;AAAA,IACA;AACC,UAAI,QAAQ,IAAI,MAAM,IAAI;AAC1B;AAAA,EACF;AACD;AAcA,SAAS,WAAWA,OAAM,QAAQ;AACjC,MAAI,OAAO,oBAAoB,YAAY;AAC1C,WAAO,gBAAgBA,OAAM,MAAM;AAAA,EACpC,OAAO;AACN,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACnE;AACD;AAQA,SAAS,UAAU,OAAO;AACzB,QAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;AAExD,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,WAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,SAAO;AACR;AASA,SAAS,oBAAoB,OAAO,QAAQ,GAAG;AAC9C,QAAM,MAAM,WAAW,KAAK,MAAM,QAAQ,uBAAuB,EAAE,CAAC;AACpE,QAAM,KAAK,IAAI,YAAY,IAAI,SAAS,KAAK;AAE7C,WAAS,IAAI,GAAG,MAAM,IAAI,SAAS,OAAO,IAAI,KAAK,KAAK;AACvD,OAAG,CAAC,IAAI;AACR,aAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,EAAE,GAAG;AACpC,SAAG,CAAC,KAAK,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK;AAAA,IACjD;AAAA,EACD;AACA,SAAO;AACR;AAOO,SAAS,mBAAmB,IAAI;AACtC,oBAAkB;AACnB;AASO,SAAS,OAAOA,OAAM,UAAU,aAAa;AACnD,gBAAc,eAAe;AAC7B,aAAW,YAAY;AAEvB,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO,UAAUA,KAAI;AAAA,IAEtB,KAAK;AACJ,UAAI,gBAAgB,QAAQ;AAC3B,QAAAA,QAAO,WAAWA,OAAM,WAAW;AAAA,MACpC,OAAO;AACN,QAAAA,QAAO,oBAAoBA,OAAM,CAAC;AAAA,MACnC;AACA,aAAOA;AAAA,IAER,KAAK;AACJ,aAAOA;AAAA,IAER,KAAK;AACJ,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAEjE;AACC,YAAM,IAAI,MAAM,6BAA6B,QAAQ;AAAA,EACvD;AACD;AAQO,SAAS,MAAM,KAAK;AAE1B,QAAM,MAAM,CAAC;AAEb,MAAI,OAAO;AAEX,MAAI,IAAI,aAAa,GAAG;AAEvB,oBAAgB,KAAK,GAAG;AAAA,EACzB;AAGA,MAAI,IAAI,cAAc,GAAG;AACxB,UAAM,WAAW,IAAI;AACrB,eAAW,QAAQ,UAAU;AAC5B,cAAQ,KAAK,UAAU;AAAA,QACtB,KAAK;AACJ,oBAAU,KAAK,IAAI;AACnB;AAAA,QAED,KAAK;AACJ,kBAAQ,KAAK,UAAU,KAAK;AAC5B;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,MAAI,MAAM;AACT,QAAI,OAAO;AAAA,EACZ;AAEA,SAAO;AACR;AASO,SAAS,mBAAmB,KAAKA,OAAM;AAC7C,QAAM,aAAaA,MAAK;AACxB,QAAM,QAAQA,MAAK;AACnB,MAAI,OAAO,eAAe,aAAa;AACtC,eAAW,YAAY,YAAY;AAClC,UAAI,WAAW,eAAe,QAAQ,GAAG;AACxC,YAAI,OAAO;AACX,YAAI,OAAO;AACX,YAAI,QAAQ,WAAW,QAAQ;AAE/B,YAAI,OAAO,WAAW,QAAQ,EAAE,SAAS,aAAa;AACrD,iBAAO,WAAW,QAAQ,EAAE;AAAA,QAC7B;AACA,YAAI,OAAO,UAAU,aAAa;AACjC,iBAAO,MAAM,QAAQ;AAAA,QACtB,WAAW,OAAO,WAAW,QAAQ,EAAE,SAAS,aAAa;AAC5D,iBAAO,WAAW,QAAQ,EAAE;AAAA,QAC7B;AACA,YAAI,OAAO,WAAW,QAAQ,EAAE,UAAU,aAAa;AACtD,kBAAQ,WAAW,QAAQ,EAAE;AAAA,QAC9B;AAEA,YAAI,IAAI,IAAI,YAAY,MAAM,MAAM,KAAK;AAAA,MAC1C;AAAA,IACD;AAAA,EACD;AACD;;;ACzYA,SAAS,UAAU,MAAM,MAAM;AAE9B,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,WAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACpC,UAAM,GAAG,IAAI,IAAI,MAAM,IAAI;AAC3B,aAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACpC,YAAM,GAAG,EAAE,GAAG,IAAI;AAAA,IACnB;AAAA,EACD;AACA,SAAO;AACR;AAMA,SAAS,aAAa,OAAO,QAAQC,OAAM;AAC1C,MAAI,MAAM;AACV,MAAI;AACJ,MAAI;AAGJ,MAAI,OAAO,OAAO,SAAS,aAAa;AACvC,YAAQ,OAAO;AACf,aAAS,OAAO;AAAA,EACjB,OAAO;AACN,YAAQ,OAAO;AACf,aAAS,OAAO;AAAA,EACjB;AAEA,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAE/B,YAAM,MAAMA,MAAK,KAAK;AAEtB,UAAI,QAAQ,GAAG;AAEd,cAAM,UAAU,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,MAAM;AAAA,UACnD;AAAA,UACA,IAAI,OAAO;AAAA,UACX,IAAI,OAAO;AAAA,QACZ;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAMA,IAAqB,WAArB,cAAsC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUhD,YAAY,KAAKA,OAAM,WAAW,YAAYC,cAAa,UAAU,GAAG;AAEvE,UAAM,GAAG,GAAG,GAAG,CAAC;AAGhB,SAAK,YAAYD,MAAK,aAAa;AACnC,SAAK,aAAaA,MAAK,cAAc;AAGrC,SAAK,cAAcC;AAOnB,SAAK,IAAI;AAOT,SAAK,IAAI;AAMT,SAAK,WAAW;AAIhB,SAAK,UAAU,KAAK,WAAW,KAAK,SAAS,kBAAkB,CAAC,IAAI;AAGpE,SAAK,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,QAAQ;AAAA,IACT;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC9C,YAAM,UAAU,KAAK,SAAS,kBAAkB,CAAC;AACjD,WAAK,YAAY,QAAQ,KAAK;AAAA,QAC7B,KAAK,YAAY;AAAA,QACjB,QAAQ;AAAA,MACT;AACA,WAAK,YAAY,SAAS,KAAK;AAAA,QAC9B,KAAK,YAAY;AAAA,QACjB,QAAQ;AAAA,MACT;AAAA,IACD;AAMA,SAAK,mBAAmB,CAAC;AAMzB,SAAK,aAAa;AAQlB,SAAK,cAAcD,MAAK,eAAe;AAMvC,SAAK,QAAQA,MAAK;AAGlB,SAAK,IAAI,IAAI;AAGb,SAAK,YAAY,IAAI,GAAG,CAAC;AAGzB,SAAK,OAAOA,MAAK;AACjB,SAAK,OAAO,CAACA,MAAK;AAClB,SAAK,OAAO,CAACA,MAAK;AAGlB,UAAM,UAAU,OAAOA,MAAK,YAAY,cAAc,CAACA,MAAK,UAAU;AACtE,SAAK,WAAW,UAAU,CAACA,MAAK,UAAU,CAAC;AAG3C,QAAI,OAAOA,MAAK,cAAc,UAAU;AAEvC,WAAK,KAAK,SAASA,MAAK,WAAW,IAAI;AAAA,IACxC;AAGA,QAAI,KAAK,gBAAgB,aAAa;AACrC,WAAK,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK,YAAY;AACzD,WAAK,UAAU,KAAK,OAAO,KAAK,SAAS,KAAK,aAAa;AAAA,IAC5D,OAAO;AACN,WAAK,QAAQ,KAAK,OAAO,KAAK;AAC9B,WAAK,SAAS,KAAK,OAAO,KAAK;AAAA,IAChC;AAGA,IAAS,mBAAmB,MAAMA,KAAI;AAGtC,SAAK,YAAY,IAAI,YAAY,CAAC;AAGlC,SAAK,YAAY,UAAU,KAAK,MAAM,KAAK,IAAI;AAE/C,QAAI,IAAI,aAAa,GAAG;AAEvB;AAAA,QACC;AAAA,QACA;AAAA,QACS,OAAOA,MAAK,MAAMA,MAAK,UAAUA,MAAK,WAAW;AAAA,MAC3D;AAAA,IACD,WAAW,IAAI,aAAa,GAAG;AAE9B,MAAAA,MAAK,OAAO,QAAQ,CAAC,UAAU;AAE9B;AAAA,UACC;AAAA,UACA;AAAA,UACS,OAAO,MAAM,MAAMA,MAAK,UAAUA,MAAK,WAAW;AAAA,QAC5D;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA,EAGA,kBAAkB;AACjB,QAAI,KAAK,qBAAqB,QAAW;AACxC,WAAK,mBAAmB,CAAC;AAAA,IAC1B;AAEA,QAAI,KAAK,UAAU;AAClB,YAAM,UAAU,KAAK,SAAS;AAC9B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAI,QAAQ,CAAC,EAAE,YAAY;AAC1B,eAAK,iBAAiB,KAAK,QAAQ,CAAC,CAAC;AAAA,QACtC;AAAA,MACD;AAAA,IACD;AAEA,SAAK,aAAa,KAAK,iBAAiB,SAAS;AAGjD,QAAI,OAAO,KAAK,cAAc,eAAe,KAAK,eAAe,OAAO;AACvE,WAAK,YAAY,KAAK,SAAS,gBAAgB,EAAE;AAAA,IAClD,OAAO;AAEN,WAAK,YAAY;AAAA,IAClB;AAGA,QAAI,KAAK,cAAc,QAAQ,CAAC,KAAK,gBAAgB;AACpD,WAAK,iBAAiB,IAAI,eAAe;AAAA,QACxC,QAAQ,aAAa,KAAK,OAAO,KAAK,MAAM;AAAA,QAC5C,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,aAAa;AAAA,MACd,CAAC;AAED,WAAK,YAAY,EAAE,cAAc,KAAK,gBAAgB,MAAM,IAAI;AAAA,IACjE;AAEA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA,EAGA,oBAAoB;AAGnB,SAAK,mBAAmB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAYE,WAAU;AACrB,SAAK,WAAWA;AAChB,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,GAAG,GAAG;AACf,UAAM,OAAO,KAAK,QAAQ,GAAG,CAAC;AAC9B,WAAO,OAAO,KAAK,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,QAAQ,GAAG,GAAG;AACb,QAAI,OAAO;AAEX,QAAI,KAAK,SAAS,GAAG,CAAC,GAAG;AACxB,YAAM,QAAQ,KAAK,YAAY,EAAE;AAAA,QAChC;AAAA,QACA;AAAA,QACA,aAAa,IAAI;AAAA,MAClB;AACA,aAAO,KAAK,OAAO,MAAM,GAAG,MAAM,CAAC;AACnC,mBAAa,QAAQ,KAAK;AAAA,IAC3B;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,MAAM,GAAG,GAAG;AACnB,SAAK,UAAU,CAAC,EAAE,CAAC,IAAI;AACvB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,QAAQ,GAAG,GAAG;AACzB,QAAI,CAAC,KAAK,QAAQ,SAAS,MAAM,GAAG;AAEnC,WAAK,UAAU,KAAK,SAAS,gBAAgB,MAAM;AAAA,IACpD;AACA,WAAO,IAAI,KAAK,GAAG,GAAG,QAAQ,KAAK,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,GAAG,GAAG,aAAa;AACzB,UAAM,KAAK,CAAC,CAAC;AACb,UAAM,KAAK,CAAC,CAAC;AAEb,UAAMA,YAAW,KAAK,YAAY;AAElC,QACC,gBAAgB,SACf,MAAM,KAAK,KAAKA,UAAS,QAAQ,MAAM,KAAK,KAAKA,UAAS,MAC1D;AACD,aAAO,KAAK,UAAU,EAAE,EAAE,EAAE;AAAA,IAC7B,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAG,GAAG;AAEf,SAAK,UAAU,CAAC,EAAE,CAAC,IAAI;AAEvB,QAAI,KAAK,WAAW;AACnB,WAAK,eAAe;AAAA,QACnB,IAAI,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AAAA,MACN;AAAA,IACD;AACA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,IAAI;AACV,QAAI,SAAS,KAAK;AAClB,QAAI,KAAK,YAAY;AACpB,eAAS,IAAI,GAAG,IAAI,KAAK,iBAAiB,QAAQ,KAAK;AACtD,iBAAS,KAAK,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK;AAAA,MACjD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAKA,WAAU,MAAM;AAEpB,QAAI,KAAK,WAAW;AACnB,YAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK;AAC7C,YAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM;AAGhD,MAAAA,UAAS;AAAA,QACR,KAAK,eAAe,UAAU;AAAA,QAC9B,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QACA,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA;AAAA,QACT;AAAA,QACA;AAAA;AAAA,MACD;AAAA,IACD,OAEK;AAEJ,WAAK,YAAY,EAAE,cAAcA,WAAU,MAAM,IAAI;AAAA,IACtD;AAAA,EACD;AACD;;;AC9aA,IAAqB,cAArB,MAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,YAAY,MAAM,MAAM,WAAW,YAAY;AAC9C,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,SAAS,IAAI,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,WAAW;AACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOC,KAAK,cAAc,UAAU,aAC7B,KAAK,eAAe,UAAU;AAAA;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAO;AAChB,UAAM,SAAS,iBAAiB,WAAW,WAAW,IAAI,IAAI,KAAK;AACnE,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,KAAK,OAAO,KAAK;AAAA,MACjB,KAAK,OAAO,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,KAAK,KAAK,GAAG;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQZ,gBAAgB;AAAA,EAAC;AAClB;;;ACvFA,IAAM,kBAAkB;AAAA,EACvB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACb,EAAE,GAAG,GAAI,GAAG,GAAG;AAAA,EACf,EAAE,GAAG,GAAI,GAAG,EAAE;AAAA,EACd,EAAE,GAAG,GAAI,GAAG,EAAE;AACf;AACA,IAAM,kBAAkB;AAAA,EACvB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACb,EAAE,GAAG,IAAI,GAAG,EAAG;AAAA,EACf,EAAE,GAAG,GAAG,GAAG,EAAG;AAAA,EACd,EAAE,GAAG,GAAG,GAAG,EAAG;AACf;AAKA,IAAqB,uBAArB,cAAkD,YAAY;AAAA;AAAA;AAAA;AAAA,EAI7D,YAAY,KAAK;AAChB,UAAM,IAAI,MAAM,IAAI,MAAM,IAAI,YAAY,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC;AAEjE,SAAK,gBAAgB,IAAI,iBAAiB;AAC1C,SAAK,WAAW,IAAI,gBAAgB;AACpC,SAAK,cAAc,IAAI,iBAAiB;AAExC,SAAK,cAAc;AACnB,SAAK,cAAc;AAEnB,QAAI,IAAI,gBAAgB,aAAa;AACpC,UAAI,KAAK,UAAU;AAClB,aAAK,cAAc,KAAK;AAAA,MACzB,OAAO;AACN,aAAK,cAAc,KAAK;AAAA,MACzB;AAAA,IACD;AAEA,SAAK,eAAe,KAAK,YAAY,KAAK,eAAe;AACzD,SAAK,eAAe,KAAK,aAAa,KAAK,eAAe;AAE1D,SAAK,cAAc,KAAK,cAAc,KAAK;AAC3C,SAAK,YAAY,KAAK,cAAc,KAAK;AAEzC,SAAK,UAAU;AAAA,MACd,IAAI,SAAS;AAAA,MACb,IAAI,SAAS;AAAA,MACb,IAAI,SAAS;AAAA,MACb,IAAI,SAAS;AAAA,IACd;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,WAAO,MAAM,gBAAgB,eAAe,MAAM,UAAU,KAAK;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,UAAM,SAAS,iBAAiB,WAAW,WAAW,IAAI,IAAI,KAAK;AAGnE,QAAI,KAAK,UAAU;AAClB,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK,OAAO,KAAK,cAAc,KAAK;AAAA,QACpC,KAAK,QAAQ,KAAK,aAAa,KAAK;AAAA,MACrC;AACA,UAAI,OAAO,QAAQ,GAAG;AACrB,eAAO,UAAU,KAAK;AAAA,MACvB;AAAA,IACD,OAAO;AACN,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK,QAAQ,KAAK,YAAY,KAAK;AAAA,QACnC,KAAK,OAAO,KAAK,YAAY,KAAK;AAAA,MACnC;AACA,UAAI,OAAO,SAAS,GAAG;AACtB,eAAO,SAAS,KAAK;AAAA,MACtB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAG;AACb,WAAO,KAAK,YAAa,IAAI,IAAK,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAG;AACb,WAAO,CAAC,KAAK,YAAa,IAAI,IAAK,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,GAAG,GAAG,GAAG;AAChB,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,CAAC,KAAK,UAAU;AACnB,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACjB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB;AAAA,IACD,OAAO;AACN,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,CAAC;AAAA,MACjB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,GAAG,GAAG,GAAG;AACjB,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,CAAC,KAAK,UAAU;AACnB,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB,OAAO;AACN,YAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACjB;AAAA,IACD,OAAO;AACN,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,CAAC;AAAA,MACjB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAG,GAAG,GAAG;AACnB,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,CAAC,KAAK,UAAU;AACnB,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACjB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB;AAAA,IACD,OAAO;AACN,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,CAAC;AAAA,MACjB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,GAAG,GAAG,GAAG;AACpB,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,CAAC,KAAK,UAAU;AACnB,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB,OAAO;AACN,YAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACjB;AAAA,IACD,OAAO;AACN,UAAK,IAAI,IAAK,KAAK,aAAa;AAC/B,YAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,MACrB,OAAO;AACN,YAAI,IAAI,IAAI,GAAG,CAAC;AAAA,MACjB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,KAAK,UAAU;AAElB,WAAK,KAAK,cAAc,KAAK,YAAY,KAAK;AAAA,IAC/C,OAAO;AAEN,WAAK,KAAK,cAAc,KAAK,aAAa,KAAK;AAAA,IAChD;AAGA,UAAM,iBAAiB,aAAa;AAAA,MACnC,KAAK,MAAM,KAAK,KAAK,cAAc,EAAE;AAAA,MACrC,KAAK,MAAM,KAAK,KAAK,YAAY,EAAE;AAAA,IACpC;AAGA,UAAM,MAAM,aAAa;AAAA,MACxB,IAAI,eAAe,KAAK,KAAK,cAAc;AAAA,MAC3C,IAAI,eAAe,KAAK,KAAK,YAAY;AAAA,IAC1C;AAGA,QAAI,KAAK,UAAU;AAClB,qBAAe,IAAI,eAAe,IAAI;AACtC,UAAI,KAAK,aAAa;AACrB,UAAE,eAAe;AAAA,MAClB;AAAA,IACD,OAAO;AACN,qBAAe,IAAI,eAAe,IAAI;AACtC,UAAI,KAAK,aAAa;AACrB,UAAE,eAAe;AAAA,MAClB;AAAA,IACD;AAGA,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,UAAU;AAClB,aAAO,KAAK,cAAc;AAC1B,gBAAU,OAAO,KAAK;AACtB,gBAAU,KAAK,aAAa;AAE5B,WAAK,QAAQ,CAAC,EAAE,IAAI,MAAM,OAAO;AACjC,WAAK,QAAQ,CAAC,EAAE,IAAI,SAAS,UAAU,KAAK,SAAS;AACrD,WAAK,QAAQ,CAAC,EAAE,IAAI,SAAS,UAAU,KAAK,SAAS;AACrD,WAAK,QAAQ,CAAC,EAAE,IAAI,UAAU,KAAK,aAAa,OAAO;AAAA,IACxD,OAAO;AACN,YAAM,KAAK,cAAc;AACzB,gBAAU,KAAK,YAAY;AAC3B,gBAAU,MAAM,KAAK;AAErB,WAAK,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG;AAChC,WAAK,QAAQ,CAAC,EAAE,IAAI,UAAU,KAAK,aAAa,OAAO;AACvD,WAAK,QAAQ,CAAC,EAAE,IAAI,UAAU,KAAK,aAAa,OAAO;AACvD,WAAK,QAAQ,CAAC,EAAE,IAAI,SAAS,UAAU,KAAK,SAAS;AAAA,IACtD;AAEA,QAAI,UAAU;AACd,QAAI,UAAU,OAAO;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;AAC3B,YAAM,KAAK,KAAK,QAAQ,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ;AAC5C,UAAI,KAAK,SAAS;AACjB,kBAAU;AACV,kBAAU;AAAA,MACX;AAAA,IACD;AAEA,UAAM,UAAU,KAAK,WAAW,kBAAkB;AAElD,QAAI;AAAA,MACH,eAAe,IAAI,QAAQ,OAAO,EAAE;AAAA,MACpC,eAAe,IAAI,QAAQ,OAAO,EAAE;AAAA,IACrC;AAEA,iBAAa,QAAQ,cAAc;AACnC,iBAAa,QAAQ,GAAG;AAExB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,QAAQ,KAAK,MAAM,CAAC;AAC1B,UAAM,QAAQ,KAAK,MAAM,CAAC;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAE9B,QAAI,KAAK,UAAU;AAClB,UAAI,IAAI,SAAS,KAAK,aAAa,KAAK;AACxC,UAAI,KAAK,WAAW,KAAK,GAAG;AAC3B,YAAI,KAAK,KAAK;AAAA,MACf;AACA,UAAI,IAAI,QAAQ,KAAK;AAAA,IACtB,OAAO;AACN,UAAI,IAAI,SAAS,KAAK,YAAY,KAAK;AACvC,UAAI,KAAK,WAAW,KAAK,GAAG;AAC3B,YAAI,KAAK,KAAK;AAAA,MACf;AACA,UAAI,IAAI,QAAQ,KAAK;AAAA,IACtB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAAK;AAEnB,QAAI,OAAO,IAAI,QAAQ,UAAU;AAGhC,UAAI,KAAK,IAAI;AAAA,IACd;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAASC,WAAU,GAAG,GAAG,SAAS;AACjC,UAAM,UAAU,QAAQ;AACxB,UAAM,QAAQ,KAAK,kBAAkB,GAAG,GAAG,aAAa,IAAI,CAAC;AAG7D,YAAQ;AAAA,MACPA;AAAA,MACA,QAAQ,WAAW,IAAI,MAAM;AAAA,MAC7B,QAAQ,WAAW,IAAI,MAAM,KAAK,KAAK,aAAa,QAAQ;AAAA,MAC5D;AAAA,IACD;AAEA,iBAAa,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAcA,WAAU,OAAO,MAAM;AACpC,QAAI;AAGJ,UAAM,YAAY,KAAK;AAAA,MACtB,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,aAAa,IAAI;AAAA,IAClB;AAGA,cAAU,IAAI,MAAM,GAAG;AAGvB,QAAI,WAAW,KAAK;AAAA,MACnB,UAAU,IAAI,MAAM,IAAI;AAAA,MACxB,UAAU,IAAI,MAAM,IAAI;AAAA,MACxB,aAAa,IAAI;AAAA,IAClB;AAEA,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,SAAS,SAAS,MAAM;AAO9B,UAAM,cAAc,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;AACnD,UAAM,aAAa,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;AAElD,QAAI,aAAa;AAChB,gBAAU;AAAA,IACX;AACA,QAAI,YAAY;AACf,gBAAU;AAAA,IACX;AAEA,UAAM,OAAO,MAAM;AACnB,UAAM,OAAO,MAAM;AAEnB,QAAI,KAAK,UAAU;AAElB,gBAAU,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC;AACrC,gBAAU,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC;AAErC,iBAAW,KAAK;AAAA,QACf,UAAU,IAAI,MAAM,IAAI;AAAA,QACxB,UAAU,IAAI,MAAM,IAAI;AAAA,QACxB;AAAA,MACD;AAEA,UAAI,eAAe,KAAK,WAAW,UAAU,IAAI,MAAM,IAAI,CAAC;AAG5D,aAAO,SAAS,IAAI,KAAK,UAAU,UAAU,IAAI,QAAQ;AACxD,gBAAQ,KAAK,SAAS;AACtB,eAAO,KAAK,QAAQ;AAEpB,eAAO,OAAO,IAAI,KAAK,SAAS,QAAQ,IAAI,MAAM,QAAQ,KAAK,GAAG;AACjE,iBAAO,MAAM,OAAO,QAAQ,GAAG,QAAQ,GAAG,KAAK;AAC/C,cAAI,MAAM;AAET,iBAAK,QAAQ,SAASA,WAAU,OAAO,GAAG,OAAO,GAAG,IAAI;AAAA,UACzD;AACA,iBAAO,KAAK,KAAK,YAAY,KAAK;AAAA,QACnC;AAEA,YAAI,cAAc;AACjB,oBAAU,KAAK;AACf,oBAAU,KAAK;AACf,mBAAS,KAAK,KAAK;AACnB,yBAAe;AAAA,QAChB,OAAO;AACN,oBAAU,KAAK;AACf,mBAAS,KAAK,KAAK;AACnB,yBAAe;AAAA,QAChB;AAEA,iBAAS,KAAK,KAAK;AAAA,MACpB;AACA,mBAAa,QAAQ,OAAO;AAC5B,mBAAa,QAAQ,MAAM;AAAA,IAC5B,OAAO;AAEN,gBAAU,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC;AACrC,gBAAU,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC;AAErC,iBAAW,KAAK;AAAA,QACf,UAAU,IAAI,MAAM,IAAI;AAAA,QACxB,UAAU,IAAI,MAAM,IAAI;AAAA,QACxB;AAAA,MACD;AAGA,UAAI,KAAK,WAAW,UAAU,CAAC,GAAG;AACjC,iBAAS,KAAK,KAAK;AAAA,MACpB;AAGA,aAAO,SAAS,IAAI,KAAK,UAAU,UAAU,IAAI,MAAM,UAAU,KAAK;AACrE,gBAAQ,KAAK,SAAS;AACtB,eAAO,KAAK,QAAQ;AAEpB,YAAI,KAAK,WAAW,UAAU,CAAC,GAAG;AACjC,iBAAO,KAAK,KAAK;AAAA,QAClB;AAEA,eAAO,OAAO,IAAI,KAAK,SAAS,QAAQ,IAAI,MAAM,QAAQ,KAAK;AAC9D,iBAAO,MAAM,OAAO,QAAQ,GAAG,QAAQ,GAAG,KAAK;AAC/C,cAAI,MAAM;AAET,iBAAK,QAAQ,SAASA,WAAU,OAAO,GAAG,OAAO,GAAG,IAAI;AAAA,UACzD;AACA,iBAAO,KAAK,KAAK,YAAY,KAAK;AAAA,QACnC;AACA,iBAAS,KAAK,KAAK;AAAA,MACpB;AACA,mBAAa,QAAQ,OAAO;AAC5B,mBAAa,QAAQ,MAAM;AAAA,IAC5B;AAEA,iBAAa,QAAQ,SAAS;AAC9B,iBAAa,QAAQ,QAAQ;AAAA,EAC9B;AACD;;;ACpdA,IAAqB,uBAArB,cAAkD,YAAY;AAAA;AAAA;AAAA;AAAA,EAI7D,YAAY,KAAK;AAChB,UAAM,IAAI,MAAM,IAAI,MAAM,IAAI,WAAW,IAAI,UAAU;AAEvD,SAAK,aAAa,KAAK,YAAY;AACnC,SAAK,cAAc,KAAK,aAAa;AACrC,SAAK,UAAU,KAAK,OAAO,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,WAAO,MAAM,gBAAgB,eAAe,MAAM,UAAU,KAAK;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,UAAM,SAAS,iBAAiB,WAAW,WAAW,IAAI,IAAI,KAAK;AACnE,WAAO;AAAA,MACN;AAAA,MACA;AAAA,OACC,KAAK,OAAO,KAAK,SAAS,KAAK,YAAY;AAAA,OAC3C,KAAK,OAAO,KAAK,SAAS,KAAK,aAAa;AAAA,IAC9C;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAC9B,WAAO,IAAI;AAAA,MACV,IAAI,KAAK,cAAc,IAAI,KAAK,WAAW,KAAK;AAAA,MAChD,IAAI,KAAK,cAAc,IAAI,KAAK,WAAW,KAAK;AAAA,IACjD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAC9B,WAAO,IAAI;AAAA,OACT,IAAI,KAAK,KAAK,aAAa,KAAK;AAAA,OAChC,IAAI,KAAK,KAAK;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAAK;AACnB,UAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,UAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,UAAM,SAAS,aAAa,IAAI;AAEhC,SAAK,kBAAkB,OAAO,OAAO,MAAM;AAE3C,QAAI,IAAI,OAAO;AACf,QAAI,IAAI,OAAO;AAEf,iBAAa,QAAQ,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAASC,WAAU,GAAG,GAAG,SAAS;AACjC,UAAM,UAAU,QAAQ;AAExB,YAAQ;AAAA,MACPA;AAAA,OACE,KAAK,OAAO,KAAK,QAAQ,aAAa,IAAI,KAAK,QAAQ,aAAc;AAAA,MACtE,CAAC,QAAQ,aAAa,IAAI,KAAK,QAAQ,cAAe;AAAA,MACvD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAcA,WAAU,OAAO,MAAM;AAEpC,QAAI,UAAU,MAAM;AAGpB,UAAM,SAAS,KAAK;AAAA,MACnB,KAAK,IAAI,IAAI,QAAQ;AAAA,MACrB,KAAK,IAAI,IAAI,QAAQ;AAAA,MACrB,aAAa,IAAI;AAAA,IAClB,EAAE,UAAU;AACZ,UAAM,UAAU,KAAK;AAAA,MACpB,KAAK,IAAI,IAAI,KAAK,QAAQ,QAAQ;AAAA,MAClC,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ;AAAA,MACnC,aAAa,IAAI;AAAA,IAClB,EAAE,SAAS;AAEX,UAAM,UAAU,KAAK;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa,IAAI;AAAA,IAClB;AAGA,UAAM,WAAW,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa,IAAI;AAAA,IAClB;AACA,aAAS,KAAK,KAAK;AACnB,aAAS,KAAK,KAAK;AAOnB,UAAM,cAAc,SAAS,IAAI,KAAK,IAAI,IAAI,KAAK;AACnD,UAAM,aAAa,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;AAElD,QAAI,aAAa;AAChB,UAAI,YAAY;AACf,eAAO;AACP,iBAAS,KAAK,KAAK;AAAA,MACpB,OAAO;AACN,eAAO;AACP,iBAAS,KAAK,KAAK;AAAA,MACpB;AACA,eAAS,KAAK,KAAK;AAAA,IACpB;AAGA,QAAI,UAAU,cAAc;AAG5B,UAAM,YAAY,OAAO,MAAM;AAG/B,aACK,IAAI,SAAS,IAAI,GACrB,IAAI,KAAK,aAAa,IAAI,QAAQ,IAAI,GACtC,KAAK,KAAK,YACT;AACD,gBAAU,KAAK,MAAM;AACrB,eAAS,IAAI,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK,KAAK,WAAW;AAC5D,cAAM,UAAU,MAAM,OAAO,UAAU,GAAG,UAAU,CAAC;AAErD,YAAI,SAAS;AACZ,oBAAU,QAAQ;AAElB,gBAAM,SAAS,QAAQ;AAEvB,kBAAQ;AAAA,YACPA;AAAA,YACA,OAAO,IAAI;AAAA,YACX,OAAO,IAAI,IAAI,IAAI,QAAQ;AAAA,YAC3B;AAAA,UACD;AAAA,QACD;AAGA,kBAAU;AACV,kBAAU;AAAA,MACX;AAGA,UAAI,CAAC,SAAS;AACb,eAAO;AACP,iBAAS,KAAK,KAAK;AACnB,kBAAU;AAAA,MACX,OAAO;AACN,eAAO;AACP,iBAAS,KAAK,KAAK;AACnB,kBAAU;AAAA,MACX;AAAA,IACD;AAEA,iBAAa,QAAQ,SAAS;AAC9B,iBAAa,QAAQ,MAAM;AAC3B,iBAAa,QAAQ,OAAO;AAC5B,iBAAa,QAAQ,OAAO;AAC5B,iBAAa,QAAQ,QAAQ;AAAA,EAC9B;AACD;;;ACxMA,IAAqB,wBAArB,cAAmD,YAAY;AAAA;AAAA;AAAA;AAAA,EAI9D,YAAY,KAAK;AAChB,UAAM,IAAI,MAAM,IAAI,MAAM,IAAI,WAAW,IAAI,UAAU;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO;AAChB,WAAO,MAAM,gBAAgB,gBAAgB,MAAM,UAAU,KAAK;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAC9B,WAAO,IAAI,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,UAAU;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,UAAM,MAAM,KAAK,IAAI,SAAS;AAC9B,WAAO,IAAI,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,UAAU;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAAK;AAEnB,QAAI,OAAO,IAAI,QAAQ,UAAU;AAGhC,UAAI,KAAK,IAAI;AAAA,IACd;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAASC,WAAU,GAAG,GAAG,SAAS;AACjC,UAAM,UAAU,QAAQ;AAExB,YAAQ;AAAA,MACPA;AAAA,MACA,QAAQ,WAAW,IAAI,IAAI,KAAK;AAAA,MAChC,QAAQ,WAAW,KAAK,IAAI,KAAK,KAAK,aAAa,QAAQ;AAAA,MAC3D;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAcA,WAAU,OAAO,MAAM;AACpC,QAAI,OAAO;AACX,QAAI,OAAO;AAGX,UAAM,QAAQ,KAAK;AAAA,MAClB,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,YAAY,QAAQ,MAAM,YAAY,CAAC;AAAA,MACpE,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,YAAY,SAAS,MAAM,aAAa,CAAC;AAAA,MACtE,aAAa,IAAI;AAAA,IAClB,EAAE,UAAU;AAEZ,UAAM,MAAM,KAAK;AAAA,MAChB,KAAK,IAAI,IAAI,KAAK,QAAQ,KAAK;AAAA,MAC/B,KAAK,IAAI,IAAI,KAAK,SAAS,KAAK;AAAA,MAChC,aAAa,IAAI;AAAA,IAClB,EAAE,SAAS;AAGX,QAAI,IAAI,IAAI,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI;AAC5C,QAAI,IAAI,IAAI,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI;AAE5C,YAAQ,MAAM,aAAa;AAAA,MAC1B,KAAK;AAEJ,YAAI,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI;AAC1C,eAAO;AACP;AAAA,MACD,KAAK;AAEJ,YAAI,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI;AAC1C,eAAO;AACP;AAAA,MACD,KAAK;AAEJ,YAAI,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI;AAE1C,YAAI,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI;AAC1C,eAAO;AACP,eAAO;AACP;AAAA,MACD;AACC;AAAA,IACF;AAGA,aAAS,IAAI,MAAM,GAAG,MAAM,IAAI,GAAG,KAAK,MAAM;AAC7C,eAAS,IAAI,MAAM,GAAG,MAAM,IAAI,GAAG,KAAK,MAAM;AAC7C,cAAM,UAAU,MAAM,OAAO,GAAG,GAAG,KAAK;AACxC,YAAI,SAAS;AACZ,eAAK,SAASA,WAAU,GAAG,GAAG,OAAO;AAAA,QACtC;AAAA,MACD;AAAA,IACD;AAEA,iBAAa,QAAQ,KAAK;AAC1B,iBAAa,QAAQ,GAAG;AAAA,EACzB;AACD;;;AC3HA,IAAqB,uBAArB,cAAkD,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtE,UAAU,OAAO;AAChB,WAAO,MAAM,gBAAgB,eAAe,MAAM,UAAU,KAAK;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAG,GAAG,GAAG;AAC1B,QAAI,MAAM,KAAK,IAAI,SAAS;AAE5B,QAAI,WAAW;AACf,QAAI,WAAW;AAEf,QAAI,KAAK,UAAU;AAClB,kBAAY,KAAK,cAAc,KAAK,cAAc;AAAA,IACnD,OAAO;AACN,kBAAY,KAAK,cAAc,KAAK,cAAc;AAAA,IACnD;AAGA,QAAI,iBAAiB,aAAa;AAAA,MACjC,KAAK,MAAM,WAAW,KAAK,SAAS;AAAA,MACpC,KAAK,MAAM,WAAW,KAAK,UAAU;AAAA,IACtC;AAGA,QAAI,KAAK,UAAU;AAClB,qBAAe,IAAI,eAAe,IAAI;AACtC,UAAI,KAAK,aAAa;AACrB,UAAE,eAAe;AAAA,MAClB;AAAA,IACD,OAAO;AACN,qBAAe,IAAI,eAAe,IAAI;AACtC,UAAI,KAAK,aAAa;AACrB,UAAE,eAAe;AAAA,MAClB;AAAA,IACD;AAGA,UAAM,MAAM,aAAa;AAAA,MACxB,WAAW,eAAe,IAAI,KAAK;AAAA,MACnC,WAAW,eAAe,IAAI,KAAK;AAAA,IACpC;AAGA,UAAM,QAAQ,IAAI,KAAK,KAAK,aAAa,KAAK;AAE9C,QAAI,KAAK,cAAc,QAAQ,IAAI,GAAG;AACrC,uBAAiB,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,eAAe;AAAA,QACf;AAAA,MACD;AAAA,IACD;AACA,QAAI,CAAC,KAAK,cAAc,QAAQ,IAAI,GAAG;AACtC,uBAAiB,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,eAAe;AAAA,QACf;AAAA,MACD;AAAA,IACD;AACA,QAAI,KAAK,cAAc,QAAQ,IAAI,GAAG;AACrC,uBAAiB,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,eAAe;AAAA,QACf;AAAA,MACD;AAAA,IACD;AACA,QAAI,KAAK,cAAc,IAAI,QAAQ,IAAI,GAAG;AACzC,uBAAiB,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,eAAe;AAAA,QACf;AAAA,MACD;AAAA,IACD;AAEA,UAAM,KAAK,kBAAkB,eAAe,GAAG,eAAe,GAAG,GAAG;AAEpE,QAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAG5B,QAAI;AAAA,MACH,IAAI,IAAI,KAAK,YAAY;AAAA,MACzB,IAAI,KAAK,KAAK,YAAY,KAAK;AAAA,IAChC;AAEA,QACE,IAAI,KAAK,YAAY,KAAK,KAAK,CAAC,CAAC,EACjC,OAAO,SAAS,GAAG,CAAC,EACpB,IAAI,cAAc;AAEpB,iBAAa,QAAQ,cAAc;AACnC,iBAAa,QAAQ,GAAG;AAExB,WAAO;AAAA,EACR;AACD;;;ACnGO,SAAS,kBAAkB,KAAK;AACtC,UAAQ,IAAI,aAAa;AAAA,IACxB,KAAK;AACJ,aAAO,IAAI,sBAAsB,GAAG;AAAA,IAErC,KAAK;AACJ,aAAO,IAAI,qBAAqB,GAAG;AAAA,IAEpC,KAAK;AACJ,aAAO,IAAI,qBAAqB,GAAG;AAAA,IAEpC,KAAK;AACJ,aAAO,IAAI,qBAAqB,GAAG;AAAA;AAAA,IAGpC;AACC,YAAM,IAAI,MAAM,IAAI,cAAc,mCAAmC;AAAA,EACvE;AACD;;;ACdA,IAAqB,YAArB,MAA+B;AAAA,EAC9B,YAAY,KAAK,UAAU,GAAG;AAK7B,SAAK,SAAS;AAMd,SAAK,OAAO,SAAS;AAMrB,SAAK,IAAI,CAAC,SAAS;AAMnB,SAAK,IAAI,CAAC,SAAS;AAMnB,SAAK,IAAI,CAAC;AAMV,SAAK,QAAQ,CAAC,SAAS,SAAS;AAMhC,SAAK,SAAS,CAAC,SAAS,UAAU;AAOlC,SAAK,MAAM,CAAC,SAAS,OAAO;AAM5B,SAAK,YAAY,SAAS;AAQ1B,SAAK,OAAO,SAAS;AAMrB,SAAK,QACJ,OAAO,SAAS,UAAU,cAAc,SAAS,QAAQ,SAAS;AAOnE,SAAK,OAAO;AAMZ,SAAK,WAAW,SAAS,CAAC,SAAS,YAAY,CAAC;AAMhD,SAAK,KAAK,CAAC,SAAS,MAAM;AAM1B,SAAK,cAAc,IAAI;AAMvB,SAAK,SAAS;AAMd,SAAK,YAAY;AAMjB,SAAK,UAAU;AAMf,SAAK,YAAY;AAMjB,SAAK,aAAa;AAGlB,QAAI,OAAO,KAAK,QAAQ,UAAU;AACjC,WAAK,QAAQ,IAAI,QAAQ;AAAA,IAC1B,OAAO;AACN,UAAI,OAAO,SAAS,YAAY,aAAa;AAC5C,aAAK,YAAY;AAAA,MAClB,WAAW,OAAO,SAAS,UAAU,aAAa;AACjD,aAAK,UAAU;AAAA,MAChB,WAAW,OAAO,SAAS,YAAY,aAAa;AACnD,aAAK,SAAS,SAAS;AACvB,aAAK,YAAY;AAAA,MAClB,WAAW,OAAO,SAAS,aAAa,aAAa;AACpD,aAAK,SAAS,SAAS;AACvB,aAAK,aAAa;AAAA,MACnB;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,SAAS,aAAa;AAEzC,WAAK,OAAO,SAAS;AAErB,WAAK,KAAK,OAAO,SAAS,KAAK,cAAc;AAC7C,WAAK,KAAK,OAAO,SAAS,KAAK,aAAa;AAC5C,WAAK,KAAK,YAAY,SAAS,KAAK,SAAS;AAC7C,WAAK,KAAK,YAAY,SAAS,KAAK,UAAU;AAC9C,WAAK,KAAK,eAAe,SAAS,KAAK,UAAU;AACjD,WAAK,KAAK,QAAQ,KAAK;AACvB,WAAK,KAAK,SAAS,KAAK;AAExB,yBAAmB,KAAK,MAAM,QAAQ;AAAA,IACvC,OAAO;AAEN,yBAAmB,MAAM,QAAQ;AAEjC,UAAI,CAAC,KAAK,QAAQ;AAEjB,aAAK,SAAS,KAAK,eAAe;AAAA,MACnC;AAAA,IACD;AAGA,QAAI,CAAC,IAAI,UAAU;AAClB,UAAI,YAAY,EAAE,eAAe,IAAI;AAAA,IACtC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,UAAU;AAEjB,UAAM,UAAU,SAAS,gBAAgB,KAAK,GAAG;AAEjD,QAAI,QAAQ,iBAAiB,OAAO;AAEnC,WAAK,QAAQ,KAAK,aAAa,QAAQ;AACvC,WAAK,SAAS,KAAK,cAAc,QAAQ;AAAA,IAC1C;AAGA,SAAK,OAAO,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB;AAChB,UAAM,SAAS,CAAC;AAGhB,QAAI,KAAK,cAAc,MAAM;AAE5B,aAAO;AAAA,QACN,YACE,IAAI,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,KAAK,OAAO,KAAK,MAAM,EAC5D,OAAO,KAAK,QAAQ;AAAA,MACvB;AAAA,IACD,WAAW,KAAK,YAAY,MAAM;AACjC,aAAO,KAAK,UAAU,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;AAAA,IAC1C,OAAO;AAEN,UAAI,KAAK,cAAc,MAAM;AAC5B,cAAM,WAAW,YAAY,IAAI,GAAG,GAAG,KAAK,MAAM;AAClD,cAAM,WAAW,SAAS,SAAS;AAEnC,YAAI,aAAa,OAAO;AACvB,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD,WAAW,aAAa,MAAM;AAC7B,gBAAM,IAAI,MAAM,kBAAkB;AAAA,QACnC;AACA,eAAO,KAAK,SAAS,OAAO,KAAK,QAAQ,CAAC;AAAA,MAC3C,WAAW,KAAK,eAAe,MAAM;AACpC,cAAM,IAAI,KAAK;AACf,YAAI;AACJ,YAAI;AACJ,cAAM,WAAW,EAAE,SAAS;AAC5B,iBAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAGlC,eAAK,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AACpC,eAAK,aAAa,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAI,KAAK,aAAa,GAAG;AACxB,iBAAK,GAAG,OAAO,KAAK,QAAQ;AAC5B,iBAAK,GAAG,OAAO,KAAK,QAAQ;AAAA,UAC7B;AACA,iBAAO,KAAK,SAAS,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,QACzC;AAAA,MACD,OAGK;AACJ,eAAO;AAAA,UACN,YACE,IAAI,GAAG,GAAG;AAAA,YACV,aAAa,IAAI;AAAA,YACjB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,YAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,YACxC,aAAa,IAAI,GAAG,KAAK,MAAM;AAAA,UAChC,CAAC,EACA,OAAO,KAAK,QAAQ;AAAA,QACvB;AAAA,MACD;AAAA,IACD;AAGA,QAAI,KAAK,gBAAgB,aAAa;AACrC,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,YAAI,OAAO,OAAO,CAAC,EAAE,UAAU,YAAY;AAC1C,iBAAO,CAAC,EAAE,MAAM;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwB,MAAM;AAC7B,WAAO,KAAK,IAAI;AAAA,EACjB;AACD;;;ACxRA,IAAqB,WAArB,MAA8B;AAAA,EAC7B,YAAY,KAAKC,OAAM,GAAG;AAKzB,SAAK,OAAOA,MAAK;AAMjB,SAAK,QAAQA,MAAK,SAAS;AAM3B,SAAK,SAASA,MAAK,UAAU;AAM7B,SAAK,YAAYA,MAAK;AAMtB,SAAK,QAAQA,MAAK;AAMlB,SAAK,IAAI;AAOT,SAAK,UAAU,CAAC;AAEhB,UAAM,UAAU,OAAOA,MAAK,YAAY,cAAcA,MAAK,UAAU;AACrE,SAAK,UAAU,YAAY,OAAO,MAAM,CAACA,MAAK,WAAW,GAAK,GAAK,CAAG,IAAI;AAG1E,uBAAmB,MAAMA,KAAI;AAG7B,QAAIA,MAAK,SAAS;AACjB,MAAAA,MAAK,QAAQ,QAAQ,CAAC,WAAW;AAChC,eAAO,YAAY,KAAK;AACxB,aAAK,QAAQ,KAAK,IAAI,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChD,CAAC;AAAA,IACF;AAEA,QAAIA,MAAK,QAAQ;AAChB,MAAAA,MAAK,OAAO,QAAQ,CAACA,UAAS;AAC7B,cAAM,QAAQ,IAAI;AAAA,UACjB;AAAA,UACAA;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,QACD;AAEA,cAAM,YAAY,IAAI,YAAY,CAAC;AAEnC,aAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK;AAC7C,aAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;AAChD,aAAK,QAAQ,KAAK,KAAK;AAAA,MACxB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAChB,WAAO,KAAK,QAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,KAAK;AACrB,WAAO,KAAK,QAAQ,GAAG;AAAA,EACxB;AACD;;;ACzGA,IAAqB,aAArB,MAAgC;AAAA;AAAA;AAAA;AAAA,EAI/B,YAAY,SAAS;AAEpB,SAAK,iBAAiB,CAAC;AAGvB,SAAK,kBAAkB,CAAC;AAExB,SAAK,WAAW,KAAK,UAAU,CAAC,QAAQ;AAGxC,QAAI,OAAO,QAAQ,WAAW,aAAa;AAC1C,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,aAAa,GAAG;AAC5B,UAAI,QAAQ,SAAS,QAAQ,QAAQ;AAEpC,kBAAU,OAAO,YAAY,GAAG,CAAC;AACjC,YAAI,CAAC,SAAS;AACb,gBAAM,IAAI,MAAM,MAAM,sCAAsC;AAAA,QAC7D;AAAA,MACD;AAAA,IACD;AAEA,SAAK,OAAO,QAAQ;AACpB,SAAK,YAAY,CAAC,QAAQ;AAC1B,SAAK,aAAa,CAAC,QAAQ;AAC3B,SAAK,UAAU,CAAC,QAAQ,WAAW;AACnC,SAAK,SAAS,CAAC,QAAQ,UAAU;AAGjC,SAAK,aAAa,IAAI,SAAS;AAM/B,SAAK,aAAa;AAMlB,SAAK,eAAe;AAMpB,SAAK,QAAQ,QAAQ;AAMrB,SAAK,aAAa,oBAAI,IAAI;AAM1B,SAAK,cAAc;AAEnB,UAAM,QAAQ,QAAQ;AACtB,eAAW,KAAK,OAAO;AACtB,UAAI,MAAM,eAAe,CAAC,GAAG;AAC5B,YAAI,eAAe,MAAM,CAAC,GAAG;AAC5B,eAAK,aAAa;AAClB,eAAK,WAAW,IAAI,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ;AAAA,YAClD,IAAI;AAAA,YACJ,KAAK;AAAA,YACL,QAAQ,MAAM,CAAC,CAAC,EAAE;AAAA,YAClB,KAAK,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC;AAAA,UAC3B,CAAC;AAAA,QACF;AAEA,YAAI,gBAAgB,MAAM,CAAC,GAAG;AAC7B,cAAI,MAAM,QAAQ,MAAM,CAAC,EAAE,UAAU,GAAG;AAEvC,kBAAM,eAAe,CAAC;AACtB,uBAAW,KAAK,MAAM,CAAC,EAAE,YAAY;AACpC,2BAAa,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,IAAI,IACvC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE;AAAA,YACzB;AACA,iBAAK,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,UAAU,YAAY;AAAA,UAChE,OAAO;AAEN,iBAAK,gBAAgB,CAAC,IAAI,KAAK,UAAU,MAAM,CAAC,EAAE,UAAU;AAAA,UAC7D;AAAA,QACD;AACA,YAAI,WAAW,MAAM,CAAC,GAAG;AACxB,gBAAM,QAAQ,SAAS,MAAM,CAAC,EAAE,KAAK;AACrC,cAAI,CAAC,OAAO;AACX,kBAAM,IAAI;AAAA,cACT,eACC,MAAM,CAAC,EAAE,QACT,uBACC,CAAC,IAAI,KAAK,YACX;AAAA,YACF;AAAA,UACD;AACA,eAAK,gBAAgB,CAAC,IAAI,KAAK,QAAQ,IAAI;AAAA,QAC5C;AAAA,MACD;AAAA,IACD;AAEA,SAAK,eAAe,KAAK,gBAAgB,SAAS;AAElD,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ;AACX,WAAK,WAAW,IAAI,CAAC,OAAO;AAC5B,WAAK,WAAW,IAAI,CAAC,OAAO;AAAA,IAC7B;AAGA,UAAM,WAAW,QAAQ;AACzB,QAAI,UAAU;AACb,iBAAW,KAAK,UAAU;AACzB,YAAI,SAAS,eAAe,CAAC,GAAG;AAC/B,eAAK,gBAAgB,CAAC,IAAI,KAAK,UAAU,SAAS,CAAC,CAAC;AAAA,QACrD;AAAA,MACD;AAAA,IACD;AAGA,QAAI,KAAK,iBAAiB,OAAO;AAEhC,WAAK,QAAQ,SAAS,QAAQ,KAAK;AAEnC,UAAI,CAAC,KAAK,OAAO;AAChB,cAAM,IAAI;AAAA,UACT,eACC,QAAQ,QACR,yBACA,KAAK,OACL;AAAA,QACF;AAAA,MACD;AAGA,WAAK,UAAU,SAAS,MAAM,IAAI,KAAK,OAAO;AAAA,QAC7C,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MACf,CAAC;AACD,WAAK,QAAQ,KAAK,QAAQ,SAAS;AAGnC,YAAM,aACL,CAAC,QAAQ,WACT,KAAK,MAAM,KAAK,MAAM,SAAS,KAAK,YAAY,KAAK,QAAQ;AAC9D,UAAI,aAAa,KAAK;AAAA,QACrB,KAAK,MAAM,UAAU,KAAK,aAAa,KAAK;AAAA,MAC7C;AACA,UAAI,QAAQ,YAAY,aAAa,GAAG;AACvC,UAAE;AAAA,MACH;AAEA,WAAK,UAAU,KAAK,YAAY,aAAa,aAAa,KAAK;AAC/D,UACC,QAAQ,aACR,KAAK,UAAU,KAAK,WAAW,MAAM,CAAC,QAAQ,WAC7C;AACD,gBAAQ;AAAA,UACP,0BACE,KAAK,UAAU,KAAK,WAAW,KAChC,0CACA,QAAQ,YACR;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,KAAK;AACjB,WAAO,KAAK,gBAAgB,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,KAAK,MAAM;AAE1B,SAAK,eAAe,GAAG,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK;AACb,WAAO,OAAO,KAAK,YAAY,OAAO,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,KAAK;AAClB,UAAM,UAAU,MAAM,KAAK;AAE3B,QAAI,KAAK,WAAW,IAAI,OAAO,GAAG;AAEjC,aAAO,KAAK,WAAW,IAAI,OAAO,EAAE,IAAI;AAAA,IACzC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,QAAQ;AACzB,WAAO,KAAK,eAAe,MAAM;AAAA,EAClC;AAAA;AAAA,EAGA,OAAO,IAAI;AACV,QAAI,WAAW;AACf,UAAM,MAAM,cAAM,QAAQ;AAC1B,QAAI,SAAS;AAEb,QAAI,KAAK,gBAAgB,KAAK;AAC7B,WAAK,cAAc;AAEnB,WAAK,WAAW,QAAQ,CAAC,SAAS;AACjC,aAAK,MAAM;AACX,mBAAW,KAAK,IAAI;AACpB,eAAO,KAAK,MAAM,UAAU;AAC3B,eAAK,MAAM;AACX,eAAK,OAAO,KAAK,MAAM,KAAK,KAAK,OAAO;AACxC,eAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAC/B,qBAAW,KAAK,IAAI;AACpB,mBAAS;AAAA,QACV;AAAA,MACD,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,SAASC,WAAU,IAAI,IAAI,SAAS;AAEnC,QAAI,QAAQ,SAAS;AACpB,MAAAA,UAAS,KAAK;AAEd,MAAAA,UAAS,UAAU,IAAI,EAAE;AACzB,MAAAA,UAAS,UAAU,QAAQ,gBAAgB;AAE3C,WAAK,KAAK;AAAA,IACX;AAGA,QAAI,KAAK,iBAAiB,MAAM;AAE/B,MAAAA,UAAS;AAAA,QACR,KAAK,gBAAgB,QAAQ,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACT;AAAA,IACD,OAAO;AAEN,YAAM,SAAS,KAAK,MAAM,KAAK,cAAc,QAAQ,MAAM,CAAC,EAAE;AAE9D,MAAAA,UAAS;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,KAAK,YAAYA,UAAS;AAAA,QAC1B,KAAK,aAAaA,UAAS;AAAA,MAC5B;AAAA,IACD;AAEA,QAAI,QAAQ,SAAS;AAEpB,MAAAA,UAAS,QAAQ;AAAA,IAClB;AAAA,EACD;AACD;;;AClTA,IAAqB,kBAArB,MAAqC;AAAA,EACpC,cAAc;AACb,SAAK,WAAW,CAAC;AACjB,SAAK,SAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,SAAK,SAAS,KAAK,OAAO;AAC1B,SAAK;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,GAAG;AACpB,WAAO,KAAK,SAAS,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,KAAK;AACpB,QAAI,eAAe;AAGnB,WAAO;AAGP,aAAS,IAAI,GAAG,MAAM,KAAK,SAAS,QAAQ,IAAI,KAAK,KAAK;AAEzD,UAAI,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACnC,eAAO,KAAK,SAAS,CAAC;AAAA,MACvB;AAEA,UACC,KAAK,SAAS,CAAC,EAAE,aAAa,KAAK,SAAS,CAAC,EAAE,WAC/C,OAAO,KAAK,SAAS,CAAC,EAAE,UACvB;AAED,uBAAe;AAAA,MAChB;AAAA,IACD;AAEA,QAAI,iBAAiB,IAAI;AACxB,aAAO,KAAK,SAAS,YAAY;AAAA,IAClC,OAAO;AACN,YAAM,IAAI,MAAM,uCAAuC,GAAG;AAAA,IAC3D;AAAA,EACD;AACD;;;ACxCA,SAAS,UAAU,KAAKC,OAAM,GAAG;AAChC,SAAO,IAAI;AAAA,IACV;AAAA,IACAA;AAAA,IACA,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ;AAAA,EACD;AACD;AAMA,SAAS,eAAe,KAAKA,OAAM,GAAG;AAErC,qBAAmBA,MAAK,YAAYA,KAAI;AAGxC,QAAM,aAAa,oBAAK;AAAA,IACvB;AAAA;AAAA,IAEA,CAACA,MAAK,WAAW,CAACA,MAAK,KAAK;AAAA,IAC5B,CAACA,MAAK,WAAW,CAACA,MAAK,KAAK;AAAA,IAC5B,OAAO;AAAA,MACN;AAAA,QACC,MAAMA,MAAK;AAAA,QACX,OAAOA,MAAK;AAAA,QACZ,OAAO,aAAa,IAAI,CAACA,MAAK,aAAa,GAAK,CAACA,MAAK,aAAa,CAAG;AAAA;AAAA,QAEtE,MACC,OAAOA,MAAK,cAAc,cACvB,UAAU,IAAI,EAAE,SAASA,MAAK,WAAW,IAAI,IAC7C;AAAA,QACJ;AAAA,MACD;AAAA,MACAA,MAAK;AAAA,IACN;AAAA,EACD;AAGA,QAAM,UAAU,OAAOA,MAAK,YAAY,cAAcA,MAAK,UAAU;AACrE,aAAW,WAAW,UAAU,CAACA,MAAK,UAAU,CAAC;AAEjD,SAAO;AACR;AAMA,SAAS,YAAYA,OAAM;AAC1B,SAAO,IAAI,WAAWA,KAAI;AAC3B;AAMA,SAAS,gBAAgB,KAAKA,OAAM,GAAG;AACtC,SAAO,IAAI,SAAS,KAAKA,OAAM,CAAC;AACjC;AAMA,IAAqB,aAArB,MAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/B,YAAY,SAASA,OAAM;AAK1B,SAAK,OAAOA;AAMZ,SAAK,OAAO;AAMZ,SAAK,OAAO,CAACA,MAAK;AAMlB,SAAK,OAAO,CAACA,MAAK;AAMlB,SAAK,YAAY,CAACA,MAAK;AAMvB,SAAK,aAAa,CAACA,MAAK;AAOxB,SAAK,WAAW,CAACA,MAAK,YAAY;AAOlC,SAAK,cAAcA,MAAK;AAQxB,SAAK,cAAcA,MAAK,eAAe;AAMvC,SAAK,UAAU,KAAKA,MAAK;AAMzB,SAAK,eAAe,KAAKA,MAAK;AAM9B,SAAK,QAAQA,MAAK;AAGlB,SAAK,WAAW;AAGhB,QAAI,OAAO,KAAK,WAAW,aAAa;AACvC,WAAK,SAAS,CAAC;AAAA,IAChB;AAEA,QAAI,OAAO,KAAK,iBAAiB,aAAa;AAC7C,WAAK,eAAe,CAAC;AAAA,IACtB;AAGA,SAAK,WAAWA,MAAK,WAAW;AAGhC,SAAK,eAAe,CAACA,MAAK,gBAAgB;AAG1C,SAAK,gBAAgB,CAACA,MAAK;AAC3B,SAAK,cAAcA,MAAK;AACxB,SAAK,eAAeA,MAAK;AAGzB,SAAK,SAAS,KAAK,YAAY,EAAE,UAAU,EAAE,MAAM;AAGnD,SAAK,QAAQ,KAAK,OAAO;AACzB,SAAK,SAAS,KAAK,OAAO;AAG1B,SAAK,kBAAkBA,MAAK;AAG5B,QAAI,KAAK,YAAY,eAAe,KAAK,YAAY,IAAI;AAExD,UAAI,aAAa,KAAK,SAAS,KAAK,IAAI,GAAG;AAC1C;AAAA,UACC,MAAM,KAAK,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAGA,uBAAmB,MAAMA,KAAI;AAG7B,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,QACC,OAAO,KAAK,aAAa,eACzB,CAAC,KAAK,SAAS,UAAU,IAAI,GAC5B;AACD,WAAK,WAAW,kBAAkB,IAAI;AAAA,IACvC;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AAEX,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAeA,OAAM;AACpB,QAAI,KAAK,gBAAgB,MAAM;AAC9B;AAAA,IACD;AAGA,QAAIC,UAAS;AAGb,QAAI,CAAC,KAAK,UAAU;AAEnB,WAAK,WAAW,IAAI,gBAAgB;AAAA,IACrC;AAGA,QAAI,OAAOD,MAAK,aAAa,aAAa;AACzC,YAAM,WAAWA,MAAK;AACtB,eAAS,QAAQ,CAAC,YAAY;AAE7B,aAAK,SAAS,IAAI,YAAY,OAAO,CAAC;AAAA,MACvC,CAAC;AAAA,IACF;AAGA,QAAI,KAAK,kBAAkB;AAE1B,WAAK,OAAO;AAAA,QACX,oBAAK,KAAK,cAAc,GAAG,GAAG;AAAA,UAC7B,MAAM;AAAA,UACN,OAAO,KAAK;AAAA,UACZ,GAAGC;AAAA,QACJ,CAAC;AAAA,MACF;AAAA,IACD;AAEA,IAAAD,MAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,cAAQ,MAAM,MAAM;AAAA,QACnB,KAAK;AACJ,eAAK,OAAO,KAAK,eAAe,MAAM,OAAOC,SAAQ,CAAC;AACtD;AAAA,QAED,KAAK;AACJ,eAAK,OAAO,KAAK,UAAU,MAAM,OAAOA,SAAQ,CAAC;AACjD;AAAA;AAAA,QAGD,KAAK;AACJ,eAAK,aAAa,KAAK,gBAAgB,MAAM,OAAOA,SAAQ,CAAC;AAC7D;AAAA;AAAA,QAGD,KAAK;AACJ,eAAK,aAAa,KAAK,gBAAgB,MAAM,OAAOA,SAAQ,CAAC;AAC7D;AAAA,QAED;AACC;AAAA,MACF;AAAA,IACD,CAAC;AAED,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,SAAS,mBAAmB;AAC5C,UAAM,QAAQ,UAAU;AACxB,UAAM,SAAS,UAAU;AAEzB,UAAM,cAAc,KAAK,UAAU;AAGnC,cAAU,WAAW;AACrB,cAAU,YAAY;AAEtB,QAAI,KAAK,iBAAiB;AACzB,gBAAU,gBAAgB,SAAS,KAAK,eAAe;AAAA,IACxD;AAGA,SAAK,UAAU,EAAE,QAAQ,CAAC,UAAU;AACnC,gBAAU,SAAS,KAAK;AAAA,IACzB,CAAC;AAGD,SAAK,WAAW,OAAO,EAAE,QAAQ,CAAC,WAAW;AAC5C,gBAAU,SAAS,MAAM;AAAA,IAC1B,CAAC;AAGD,cAAU,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM;AAGtD,cAAU,KAAK,IAAI;AAMnB,aAAS,WAAW,OAAO,QAAQ;AAElC,WAAK,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA,KAAK,IAAI,YAAY,OAAO,KAAK;AAAA,QACjC,KAAK,IAAI,YAAY,QAAQ,MAAM;AAAA,MACpC;AAEA,gBAAU,IAAI;AAAA,QACb,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,YAAY,SAAS,EAAE;AAAA,QAC/C,KAAK,IAAI,GAAG,CAAC,GAAG,SAAS,YAAY,UAAU,EAAE;AAAA;AAAA,QAEjD,UAAU,IAAI;AAAA,MACf;AAAA,IACD;AAEA,QAAI,sBAAsB,MAAM;AAC/B,mBAAa,eAAe,mBAAmB,UAAU;AAEzD,iBAAW,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM;AAEpD,mBAAa,YAAY,mBAAmB,UAAU;AAAA,IACvD;AAGA,cAAU,WAAW;AACrB,cAAU,YAAY;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,SAAS;AACnB,UAAM,UAAU,CAAC;AACjB,QAAI,mBAAmB;AACvB,QAAI;AAGJ,SAAK,eAAe,KAAK,IAAI;AAE7B,aAAS,IAAI,GAAG,IAAI,KAAK,aAAa,QAAQ,KAAK;AAClD,YAAM,QAAQ,KAAK,aAAa,CAAC;AAGjC,yBAAmB,MAAM,KAAK,YAAY,EAAE,SAAS,eAAe;AAEpE,UAAI,YAAY,OAAO;AAEtB,0BAAkB,IAAI,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAG7D,wBAAgB,YAAY,IAAI,GAAG,CAAC;AAGpC,wBAAgB,OAAO,MAAM;AAC7B,wBAAgB,IAAI,IAAI,MAAM;AAC9B,wBAAgB,WAAW,MAAM,OAAO;AAGxC,wBAAgB,WAAW;AAC3B,wBAAgB,YAAY;AAAA,MAC7B;AAIA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAE9C,cAAM,WAAW,MAAM,QAAQ,CAAC;AAEhC,YAAI;AAEJ,YAAI;AAGJ,YAAI,OAAO,SAAS,gBAAgB,aAAa;AAChD,mBAAS,cAAc,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QACrC;AAEA,YAAI,OAAO,SAAS,cAAc,aAAa;AAC9C,mBAAS,OAAO,UAAU,IAAI;AAC9B,mBAAS,KAAK,SAAS,SAAS,WAAW,IAAI;AAAA,QAChD;AAMA,YAAI,oBAAoB,UAAU;AAEjC,gBAAM;AAAA,QAEP,WAAW,OAAO,SAAS,SAAS,UAAU;AAE7C,cAAI,OAAO,SAAS,KAAK,gBAAgB,aAAa;AACrD,qBAAS,KAAK,cAAc,SAAS;AAAA,UACtC;AACA,cAAI,SAAS,KAAK,WAAW,MAAM;AAClC,kBAAM,oBAAK;AAAA,cACV;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS;AAAA,YACV;AAAA,UACD,OAAO;AACN,kBAAM,oBAAK,KAAK,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,IAAI;AAAA,UAC9D;AAEA,cAAI,IAAI,IAAI,SAAS;AAAA,QACtB,WAAW,OAAO,SAAS,SAAS,UAAU;AAE7C,kBAAQ,SAAS;AACjB,cAAI,OAAO,UAAU,aAAa;AACjC,oBAAQ,YAAY,IAAI,GAAG,GAAG;AAAA,cAC7B,aAAa,IAAI,GAAG,CAAC;AAAA,cACrB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,cAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,YACzC,CAAC;AAAA,UACF;AAEA,gBAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,cAAI,OAAO,IAAI,KAAK,KAAK,KAAK;AAC9B,cAAI,KAAK,UAAU,IAAI;AAEvB,cAAI,IAAI,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAAA,QACpD,OAAO;AAEN,cAAI,OAAO,SAAS,SAAS,eAAe,SAAS,SAAS,IAAI;AACjE,kBAAM,oBAAK,KAAK,SAAS,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ;AAAA,UAChE,OAAO;AAEN,kBAAM,oBAAK;AAAA,cACV;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS;AAAA,YACV;AAEA,oBAAQ,SAAS;AACjB,gBAAI,OAAO,UAAU,aAAa;AACjC,sBAAQ,YAAY,IAAI,GAAG,GAAG;AAAA,gBAC7B,aAAa,IAAI,GAAG,CAAC;AAAA,gBACrB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,gBAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,cACzC,CAAC;AAAA,YACF;AACA,gBAAI,YAAY,IAAI,GAAG,CAAC;AACxB,gBAAI,OAAO,SAAS;AACpB,gBAAI,OAAO,SAAS;AAEpB,gBAAI,QAAQ,SAAS,SAAS,SAAS;AACvC,gBAAI,KAAK,SAAS;AAClB,gBAAI,OAAO,IAAI,KAAK,KAAK,KAAK;AAC9B,gBAAI,KAAK,UAAU,IAAI;AACvB,gBAAI,OAAO,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM;AAAA,UACnE;AAEA,cAAI,IAAI,IAAI,SAAS;AAAA,QACtB;AAEA,YAAI,oBAAoB,CAAC,SAAS,QAAQ,IAAI,MAAM;AAEnD,cAAI,KAAK,gBAAgB,UAAU,MAAM;AAEzC,cAAI,KAAK,WAAW;AAAA,QACrB;AAGA,YAAI,YAAY,OAAO;AACtB,cAAI,IAAI,iBAAiB,MAAM;AAC9B,gBAAI,WAAW,IAAI,WAAW,IAAI,MAAM,OAAO;AAE/C,gBACC,OAAO,IAAI,eAAe,eAC1B,IAAI,WAAW,iBAAiB,MAC/B;AACD,kBAAI,WAAW;AAAA,gBACd,IAAI,WAAW,WAAW,IAAI,MAAM;AAAA,cACrC;AAAA,YACD;AAAA,UACD;AAEA,kBAAQ,KAAK,GAAG;AAAA,QACjB,OAAkB;AAEjB,0BAAgB,SAAS,GAAG;AAAA,QAC7B;AAAA,MACD;AAGA,UAAI,YAAY,SAAS,gBAAgB,SAAS,SAAS,GAAG;AAE7D,wBAAgB,WAAW;AAC3B,wBAAgB,YAAY;AAG5B,gBAAQ,KAAK,eAAe;AAAA,MAC7B;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AAEX,SAAK,eAAe,KAAK,IAAI;AAC7B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACT,SAAK,WAAW;AAChB,SAAK,OAAO,SAAS;AACrB,SAAK,aAAa,SAAS;AAC3B,SAAK,cAAc;AAAA,EACpB;AACD;;;ACxkBA,IAAM,SAAS,CAAC;AAEhB,IAAM,WAAW,CAAC;AAElB,IAAI,kBAAkB;AAKtB,SAAS,cAAc,SAAS,SAAS,SAAS;AAEjD,UAAQ,UAAU,MAAM;AAGxB,OAAK,MAAM;AAGX,MAAI,OAAO,MAAM,kBAAkB,CAAC,GAAG;AACtC,WAAO,MAAM,kBAAkB,CAAC,EAAE,QAAQ;AAAA,EAC3C;AAGA,oBAAkB,SAAS,QAAQ,OAAO;AAG1C;AAAA,IACC;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACT;AAGA,eAAa,KAAK,cAAc,OAAO;AAGvC,UAAQ,SAAS,OAAO;AAExB,MAAI,SAAS;AAEZ,kBAAM,QAAQ;AAAA,EACf;AACD;AAaA,SAAS,aAAa,SAAS,WAAW,SAAS,mBAAmB;AACrE,QAAMC,SAAQ,OAAO,OAAO;AAG5B,YAAU,SAASA,OAAM,YAAY;AAGrC,YAAU,YAAY,IAAI,GAAG,CAAC;AAG9B,EAAAA,OAAM,MAAM,WAAW,SAAS,iBAAiB;AAClD;AAOO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpB,IAAI,QAAQ,SAAS,UAAU;AAC9B,YAAQ,QAAQ;AAAA,MACf,KAAK;AAEJ,YAAI,OAAO,OAAO,KAAK,MAAM;AAE5B,iBAAO,OAAO,IAAI,IAAI,WAAW,SAAS,OAAO,OAAO,CAAC;AAEzD,mBAAS,KAAK,OAAO;AAAA,QACtB,OAAO;AAEN,iBAAO;AAAA,QACR;AAGA,YAAI,UAAU;AACb,mBAAS;AAAA,QACV;AAEA,eAAO;AAAA,MAER;AACC,cAAM,IAAI,MAAM,wCAAwC,MAAM;AAAA,IAChE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCA,KAAK,SAAS,SAAS;AACtB,cAAU,OAAO;AAAA,MAChB;AAAA,QACC,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,mBAAmB;AAAA,MACpB;AAAA,MACA,WAAW,CAAC;AAAA,IACb;AAGA,QAAI,OAAO,OAAO,OAAO,MAAM,aAAa;AAC3C,YAAM,IAAI,MAAM,WAAW,UAAU,YAAY;AAAA,IAClD;AAEA,QAAI,OAAO,OAAO,aAAa,YAAY;AAE1C,YAAM,aAAa,cAAM,UAAU;AAEnC,UAAI,YAAY;AAGf,sBAAM,KAAK;AAEX,mBAAW,MAAM;AAChB,wBAAc,SAAS,SAAS,IAAI;AAAA,QACrC,CAAC;AAAA,MACF,OAAO;AACN,sBAAc,SAAS,OAAO;AAAA,MAC/B;AAAA,IACD,OAAO;AACN,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC1C;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB;AACnB,WAAO,SAAS,eAAe;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,kBAAkB;AACjB,WAAO,OAAO,KAAK,kBAAkB,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,SAAS;AAGf,WAAO,KAAK,KAAK,KAAK,kBAAkB,GAAG,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,KAAK,SAAS;AAEb,QAAI,kBAAkB,IAAI,SAAS,QAAQ;AAC1C,aAAO,KAAK,KAAK,SAAS,kBAAkB,CAAC,GAAG,OAAO;AAAA,IACxD,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,SAAS;AAEjB,QAAI,kBAAkB,KAAK,GAAG;AAC7B,aAAO,KAAK,KAAK,SAAS,kBAAkB,CAAC,GAAG,OAAO;AAAA,IACxD,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa;AACZ,WAAO,SAAS;AAAA,EACjB;AACD;;;AC7QO,SAAS,WAAW,SAASC,SAAQC,UAAS,UAAU;AAC9D,MAAI,OAAO,QAAQ,QAAQ,IAAI,MAAM,aAAa;AAEjD,WAAO;AAAA,EACR;AAKA,WAAS,aAAaC,OAAM;AAE3B,YAAQ,QAAQ,IAAI,IAAIA;AAGxB,QAAI,QAAQ,SAAS,OAAO;AAC3B,YAAM,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAAA,IACrC;AAAA,EACD;AAGA,MAAI,QAAQ,MAAM;AACjB,iBAAa,QAAQ,IAAI;AACzB,QAAI,OAAOF,YAAW,YAAY;AACjC,MAAAA,QAAO;AAAA,IACR;AACA;AAAA,EACD;AAEA,YAAU,QAAQ,KAAK,QAAQ,QAAQ,EACrC,KAAK,CAAC,aAAa;AACnB,QAAI,OAAO,aAAa,UAAU;AACjC,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACxC;AAEA,QAAI;AAEJ,YAAQ,aAAa,QAAQ,GAAG,GAAG;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AACX,cAAM,SAAS,IAAI,UAAU;AAE7B,YAAI,OAAO,OAAO,oBAAoB,aAAa;AAClD,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAEA,cAAM,SAAS,OAAO,gBAAgB,UAAU,UAAU;AAC1D,cAAME,QAAgB,MAAM,MAAM;AAElC,iBAASA,MAAK,OAAOA,MAAK,SAAS,CAAC,KAAKA;AAEzC;AAAA,MACD;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACJ,iBAAS,KAAK,MAAM,QAAQ;AAC5B;AAAA,MACD;AACC,cAAM,IAAI;AAAA,UACT,kCAAkC,aAAa,QAAQ,GAAG,CAAC;AAAA,QAC5D;AAAA,IACF;AAEA,iBAAa,MAAM;AAEnB,QAAI,OAAOF,YAAW,YAAY;AACjC,MAAAA,QAAO;AAAA,IACR;AAAA,EACD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,QAAI,OAAOC,aAAY,YAAY;AAClC,MAAAA,SAAQ,KAAK;AAAA,IACd;AAAA,EACD,CAAC;AAEF,SAAO;AACR;;;AChFO,SAAS,aAAaE,OAAMC,SAAQC,UAAS,UAAU;AAC7D,MAAI,OAAO,UAAUF,MAAK,IAAI,MAAM,aAAa;AAEhD,WAAO;AAAA,EACR;AAEA,QAAM,eAAgB,UAAUA,MAAK,IAAI,IACxC,WAAW,SAAS,cAAc,OAAO;AAE1C,MAAI,UAAUA,MAAK,GAAG,GAAG;AACxB,UAAM,WAAWA,MAAK,IAAI,MAAM,4BAA4B,EAAE,CAAC;AAC/D,QAAI,CAAC,YAAY,aAAa,YAAY,QAAQ,MAAM,IAAI;AAC3D,YAAM,IAAI;AAAA,QACT,uDAAuD,QAAQ;AAAA,MAChE;AAAA,IACD;AAAA,EACD,OAAO;AACN,QAAI,CAAC,eAAwB,aAAaA,MAAK,GAAG,CAAC,GAAG;AACrD,YAAM,IAAI;AAAA,QACT,oCAA6C,aAAaA,MAAK,GAAG,CAAC;AAAA,MACpE;AAAA,IACD;AAAA,EACD;AAEA,MAAI,UAAUA,MAAK,GAAG,GAAG;AACxB,cAAUA,MAAK,KAAK,QAAQ,QAAQ,EAClC,KAAK,CAAC,SAAS;AACf,mBAAa,MAAM,WAAW,IAAI,gBAAgB,IAAI;AAAA,IACvD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,UAAI,OAAOE,aAAY,YAAY;AAClC,QAAAA,SAAQ,KAAK;AAAA,MACd;AAAA,IACD,CAAC;AAAA,EACH,OAAO;AAEN,iBAAa,MAAMF,MAAK;AAAA,EACzB;AAEA,eAAa;AAAA,IACZ;AAAA,IACAA,MAAK,WAAW,OAAO,aAAa;AAAA,EACrC;AACA,eAAa,aAAa,eAAe,MAAM;AAC/C,eAAa,aAAa,2BAA2B,MAAM;AAC3D,eAAa,aAAa,YAAY,OAAO;AAC7C,eAAa,aAAa,eAAe,SAAS,WAAW;AAE7D,MAAIA,MAAK,aAAa,MAAM;AAC3B,iBAAa,aAAa,YAAY,MAAM;AAAA,EAC7C;AACA,MAAIA,MAAK,SAAS,MAAM;AACvB,iBAAa,aAAa,QAAQ,MAAM;AAAA,EACzC;AAEA,MAAI,OAAOC,YAAW,YAAY;AAEjC,QAAID,MAAK,WAAW,QAAQA,MAAK,aAAa,OAAO;AACpD,mBAAa,mBAAmB,MAAM;AACrC,YAAI,OAAOC,YAAW,YAAY;AACjC,UAAAA,QAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD,OAAO;AACN,mBAAa,YAAY,MAAM;AAC9B,YAAI,OAAOA,YAAW,YAAY;AACjC,UAAAA,QAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,OAAOC,aAAY,YAAY;AAClC,iBAAa,UAAU,MAAM;AAC5B,MAAAA,SAAQ;AAAA,IACT;AAAA,EACD;AAEA,eAAa,KAAK;AAElB,SAAO;AACR;;;A5ChEO,IAAI,UAAU;AAKd,IAAM,UAAU,CAAC;AAoBjB,IAAIC;AAmBJ,IAAI,kBAAkB;AAMtB,SAAS,WAAWC,UAAS,OAAO;AAC1C,YAAUA,UAAS,MAAM,CAAC,EAAE,KAAK,OAAO,IAAI,OAAY;AACzD;AAmBO,SAAS,WAAW,SAAS;AACnC,MAAI,QAAQ,gBAAgB,QAAW;AACtC,IAAAD,eAAc,QAAQ;AAAA,EACvB;AACA,MAAI,QAAQ,YAAY,QAAW;AAClC,eAAW,QAAQ,OAAO;AAAA,EAC3B;AACA,MAAI,QAAQ,oBAAoB,QAAW;AAC1C,sBAAkB,QAAQ;AAAA,EAC3B;AACD;AAgBO,SAAS,WAAW,MAAM,MAAM,MAAM;AAC5C,MAAI,SAAS,KAAK;AACjB,YAAQ,IAAI,IAAI;AAAA,EACjB,OAAO;AAEN,YAAQ,OAAO,IAAI;AACnB,YAAQ,OAAO,IAAI;AACnB,YAAQ,QAAQ,IAAI;AACpB,YAAQ,OAAO,IAAI;AACnB,YAAQ,MAAM,IAAI;AAClB,YAAQ,IAAI,IAAI;AAChB,YAAQ,KAAK,IAAI;AACjB,YAAQ,KAAK,IAAI;AAAA,EAGlB;AACD;AAWO,IAAI;AAaJ,IAAI;AAYJ,IAAI;AAKX,IAAM,UAAU,oBAAI,IAAI;AAKxB,IAAI,oBAAoB;AAGxB,IAAI,gBAAgB;AACpB,IAAI,YAAY;AAChB,IAAI,UAAU;AAKd,IAAM,sBAAsB,CAAC;AAM7B,SAAS,cAAc;AACtB,YAAU,UAAU,aAAa;AACjC,YAAU,SAAS,YAAY;AAC/B,YAAU,QAAQ,WAAW;AAC7B,YAAU,MAAM,iBAAiB;AACjC,YAAU,OAAO,UAAU;AAC3B,YAAU,OAAO,UAAU;AAC3B,YAAU,SAAe,IAAI;AAC7B,YAAU,YAAY,eAAe;AACrC,YAAU,SAAS,YAAY;AAC/B,sBAAoB;AACrB;AAMA,SAAS,gBAAgB,UAAU;AAClC,MAAI,cAAc,eAAe;AAEhC,QAAI,OAAO,aAAa,cAAc,QAAQ;AAE7C,mBAAa,OAAO;AAGpB,YAAM,WAAW,YAAY;AAC7B,iBAAW,MAAM;AAChB,iBAAS;AACT,qBAAa,KAAK,eAAe;AAAA,MAClC,GAAG,GAAG;AAAA,IACP,OAAO;AACN,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC3C;AAAA,EACD,OAAO;AACN,cAAU,WAAW,MAAM;AAC1B,sBAAgB,QAAQ;AAAA,IACzB,GAAG,GAAG;AAAA,EACP;AACD;AAMA,SAAS,iBAAiB,KAAK;AAC9B,SAAO,oBAAoB,IAAI,GAAG;AAElC;AAGA,QAAM,WAAW,YAAY;AAG7B,MAAI,OAAO,eAAe,YAAY;AAErC,eAAW,UAAU,GAAG;AAAA,EACzB;AACA,eAAa,KAAK,iBAAiB,UAAU,GAAG;AACjD;AAOA,SAAS,eAAe,KAAK;AAC5B,sBAAoB,IAAI,GAAG,IAAI;AAC/B,MAAI,KAAK,SAAS;AACjB,SAAK,QAAQ,GAAG;AAAA,EACjB;AACA,eAAa,KAAK,cAAc,GAAG;AACnC,QAAM,IAAI,MAAM,6BAA6B,IAAI,GAAG;AACrD;AAmEO,SAAS,UAAU,MAAM,UAAU;AACzC,MAAI,OAAO,aAAa,YAAY;AACnC,UAAM,IAAI,MAAM,iCAAiC,IAAI;AAAA,EACtD;AAEA,MAAI,OAAO,QAAQ,IAAI,IAAI,MAAM,aAAa;AAC7C,YAAQ,2BAA2B,OAAO,SAAS;AAAA,EACpD;AAEA,UAAQ,IAAI,MAAM,QAAQ;AAC3B;AA6CO,SAAS,QAAQ,QAAQ,UAAU,oBAAoB,MAAM;AAEnE,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,qBAAiBE;AAAA,MAChB,OAAO,CAAC;AAAA,MACR,iBAAiB,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,MACrC,eAAe,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,IACpC;AAAA,EACD;AAEA,MAAI,OAAO,aAAa,aAAa;AACpC,aAAS;AAAA,EACV;AAEA,MAAI,sBAAsB,MAAM;AAE/B,kBAAM,OAAO,cAAM,OAAO;AAAA,EAC3B;AAGA,kBAAgB,MAAM;AACvB;AAkBO,SAAS,OAAO,KAAK;AAC3B,QAAM,gBAAgB,oBAAoB,GAAG;AAC7C,OAAK,OAAO,aAAa;AACzB,mBAAiB;AACjB,mBAAiB,KAAK;AAAA,IACrB;AAAA,IACA,KAAK,iBAAiB,KAAK,MAAM,aAAa;AAAA,IAC9C,KAAK,eAAe,KAAK,MAAM,aAAa;AAAA,EAC7C;AAEA,kBAAgB,KAAK,MAAM;AAC5B;AA6BO,SAASA,MAAK,OAAOC,SAAQC,UAAS;AAE5C,MAAI,sBAAsB,OAAO;AAChC,gBAAY;AAAA,EACb;AAGA,MAAI,OAAO,QAAQ,MAAM,IAAI,MAAM,aAAa;AAC/C,UAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM;AAAA,EACzC;AAEA,QAAM,SAAS,QAAQ,IAAI,MAAM,IAAI;AAErC,MAAI,OAAO,WAAW,aAAa;AAClC,UAAM,IAAI,MAAM,+CAA+C,MAAM,IAAI;AAAA,EAC1E;AAGA,SAAO,OAAO,KAAK,MAAM,OAAOD,SAAQC,UAAS;AAAA,IAChD;AAAA,IACA,aAAaJ;AAAA,IACb;AAAA,EACD,CAAC;AACF;AASO,SAASK,QAAO,OAAO;AAC7B,UAAQ,MAAM,MAAM;AAAA,IACnB,KAAK;AACJ,UAAI,EAAE,MAAM,QAAQ,UAAU;AAC7B,eAAO;AAAA,MACR;AAEA,aAAO,QAAQ,MAAM,IAAI;AACzB,aAAO;AAAA,IAER,KAAK;AACJ,UAAI,EAAE,MAAM,QAAQ,UAAU;AAC7B,eAAO;AAAA,MACR;AACA,aAAO,QAAQ,MAAM,IAAI;AACzB,aAAO;AAAA,IAER,KAAK;AACJ,UAAI,EAAE,MAAM,QAAQ,WAAW;AAC9B,eAAO;AAAA,MACR;AAEA,aAAO,SAAS,MAAM,IAAI;AAC1B,aAAO;AAAA,IAER,KAAK;AAEJ,aAAO;AAAA,IAER,KAAK;AACJ,UACC,OAAO,OAAO,WAAW,aAAa,eACtC,OAAO,WAAW,SAAS,UAAU,aACpC;AACD,mBAAW,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI,CAAC;AACrD,eAAO,SAAS,MAAM,IAAI;AAC1B,eAAO;AAAA,MACR;AACA,aAAO;AAAA,IAER,KAAK;AAAA,IACL,KAAK;AACJ,UAAI,EAAE,MAAM,QAAQ,UAAU;AAC7B,eAAO;AAAA,MACR;AAEA,aAAO,QAAQ,MAAM,IAAI;AACzB,aAAO;AAAA,IAER,KAAK;AACJ,aAAa,OAAO,MAAM,IAAI;AAAA,IAE/B,KAAK;AACJ,UAAI,EAAE,MAAM,QAAQ,YAAY;AAC/B,eAAO;AAAA,MACR;AAEA,aAAO,UAAU,MAAM,IAAI;AAC3B,aAAO;AAAA,IAER;AACC,YAAM,IAAI;AAAA,QACT,iDAAiD,MAAM;AAAA,MACxD;AAAA,EACF;AACD;AAOO,SAASC,aAAY;AAC3B,MAAI;AAGJ,OAAK,QAAQ,SAAS;AACrB,QAAI,QAAQ,eAAe,IAAI,GAAG;AACjC,MAAAD,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,OAAK,QAAQ,SAAS;AACrB,QAAI,QAAQ,eAAe,IAAI,GAAG;AACjC,MAAAA,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,OAAK,QAAQ,SAAS;AACrB,QAAI,QAAQ,eAAe,IAAI,GAAG;AACjC,MAAAA,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,OAAK,QAAQ,UAAU;AACtB,QAAI,SAAS,eAAe,IAAI,GAAG;AAClC,MAAAA,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,OAAK,QAAQ,WAAW;AACvB,QAAI,UAAU,eAAe,IAAI,GAAG;AACnC,MAAAA,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,OAAK,QAAQ,UAAU;AACtB,QAAI,SAAS,eAAe,IAAI,GAAG;AAClC,MAAAA,QAAO;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,EAAM,UAAU;AACjB;AAQO,SAAS,OAAO,KAAK;AAE3B,QAAM,KAAK;AACX,MAAI,OAAO,SAAS;AACnB,WAAO,QAAQ,GAAG;AAAA,EACnB;AACA,SAAO;AACR;AAQO,SAAS,UAAU,KAAK;AAE9B,QAAM,KAAK;AACX,MAAI,OAAO,SAAS;AACnB,WAAO,QAAQ,GAAG;AAAA,EACnB;AACA,SAAO;AACR;AAQO,SAAS,SAAS,OAAO;AAE/B,UAAQ,YAAY,KAAK,KAAK;AAC9B,MAAI,SAAS,SAAS;AAErB,WAAO,QAAQ,KAAK;AAAA,EACrB;AACA,SAAO;AACR;AAQO,SAAS,QAAQ,KAAK;AAE5B,QAAM,KAAK;AACX,MAAI,OAAO,UAAU;AACpB,WAAO,SAAS,GAAG;AAAA,EACpB;AACA,SAAO;AACR;AAQO,SAAS,SAAS,KAAK;AAE7B,QAAM,KAAK;AACX,MAAI,OAAO,WAAW;AACrB,WAAO,UAAU,GAAG;AAAA,EACrB;AACA,SAAO;AACR;AAQO,SAAS,QAAQ,KAAK;AAE5B,QAAM,KAAK;AACX,MAAI,OAAO,UAAU;AACpB,WAAO,SAAS,GAAG;AAAA,EACpB;AACA,SAAO;AACR;;;A6CltBA,IAAqB,SAArB,cAAoC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2C9C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,GAAG,CAAC;AAMhB,SAAK,iBAAiB;AAOtB,SAAK,iBAAiB;AAOtB,SAAK,SAAS,aAAa,IAAI,GAAG,CAAC;AAOnC,SAAK,UAAU;AAaf,SAAK,SAAS;AAGd,SAAK,OAAO,CAAC;AAGb,SAAK,YAAY;AAIjB,SAAK,UAAU;AAAA;AAAA,MAEd,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA;AAAA,MAER,QAAQ,aAAa,IAAI,GAAG,CAAC;AAAA;AAAA,MAE7B,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,MAER,OAAO;AAAA;AAAA,MAEP,KAAK;AAAA,IACN;AAGA,SAAK,KAAK;AAMV,SAAK,WAAW;AAAA,MACf,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,IACR;AAGA,QAAI,SAAS,iBAAiB,cAAc;AAC3C,WAAK,SAAS,SAAS;AACvB,WAAK,QAAQ,KAAK,OAAO,WAAW;AACpC,WAAK,eAAe,SAAS;AAE7B,UAAI,OAAO,SAAS,WAAW,aAAa;AAE3C,cAAM,SAAS,KAAK,OAAO,UAAU,SAAS,MAAM;AACpD,YAAI,QAAQ;AAEX,eAAK,UAAU,MAAM;AAAA,QACtB,OAAO;AAEN,gBAAM,IAAI;AAAA,YACT,0BAA0B,SAAS,SAAS;AAAA,UAC7C;AAAA,QACD;AAAA,MACD;AAAA,IACD,OAAO;AAEN,WAAK,QACJ,OAAO,SAAS,UAAU,WACvB,SAAS,QACT,SAAS,SAAS,KAAK;AAE3B,UAAI,CAAC,KAAK,OAAO;AAChB,cAAM,IAAI;AAAA,UACT,iBAAiB,SAAS,QAAQ;AAAA,QACnC;AAAA,MACD;AAEA,WAAK,UACJ,WAAW,oBACX,KAAK,iBAAiB,WAAW;AAElC,UAAI,KAAK,SAAS;AACjB,aAAK,QACJ,KAAK,QAAQ,QACb,SAAS,aACR,SAAS,cAAc,KAAK,MAAM;AACpC,aAAK,SACJ,KAAK,QAAQ,SACb,SAAS,cACR,SAAS,eAAe,KAAK,MAAM;AAErC,aAAK,iBAAiB,KAAK,MAAM,aAAa;AAC9C,YAAI,KAAK,gBAAgB;AACxB,eAAK,MAAM,MAAM;AAAA,QAClB;AAMA,aAAK,2BAA2B,aAAa;AAAA,UAC5C;AAAA,UACA,MAAM;AACL,iBAAK,MAAM,MAAM;AAAA,UAClB;AAAA,QACD;AAGA,aAAK,MAAM,UAAU,MAAM;AAC1B,cAAI,OAAO,KAAK,YAAY,YAAY;AAEvC,gBAAI,CAAC,KAAK,MAAM,MAAM;AACrB,mBAAK,iBAAiB;AAAA,YACvB;AACA,iBAAK,QAAQ;AAAA,UACd;AAAA,QACD;AAAA,MACD,OAAO;AAEN,aAAK,QACJ,KAAK,QAAQ,QACb,SAAS,aACR,SAAS,cAAc,KAAK,MAAM;AACpC,aAAK,SACJ,KAAK,QAAQ,SACb,SAAS,cACR,SAAS,eAAe,KAAK,MAAM;AACrC,aAAK,SAAS,SAAS,MAAM,IAAI,KAAK,OAAO,QAAQ;AACrD,aAAK,eAAe,KAAK,OAAO,SAAS;AAAA,MAC1C;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,UAAU,aAAa;AAC1C,WAAK,eAAe,SAAS;AAC7B,WAAK,eAAe,SAAS;AAAA,IAC9B;AAGA,QAAI,OAAO,SAAS,UAAU,aAAa;AAC1C,WAAK,MAAM,CAAC,CAAC,SAAS,KAAK;AAAA,IAC5B;AACA,QAAI,OAAO,SAAS,UAAU,aAAa;AAC1C,WAAK,MAAM,CAAC,CAAC,SAAS,KAAK;AAAA,IAC5B;AAIA,QAAI,OAAO,SAAS,aAAa,aAAa;AAC7C,WAAK,OAAO,SAAS,QAAQ;AAAA,IAC9B;AAGA,QAAI,SAAS,aAAa;AACzB,WAAK,YAAY,IAAI,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,IACpE;AAEA,QAAI,OAAO,SAAS,SAAS,aAAa;AACzC,UAAI,SAAS,gBAAgB,OAAO;AACnC,aAAK,KAAK,KAAK,SAAS,IAAI;AAAA,MAC7B,OAAO;AAEN,aAAK,KAAK,SAAS,SAAS,IAAI;AAAA,MACjC;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,SAAS,UAAU;AACtC,WAAK,OAAO,SAAS;AAAA,IACtB;AAGA,QAAI,OAAO,SAAS,MAAM,aAAa;AACtC,WAAK,IAAI,IAAI,SAAS;AAAA,IACvB;AAGA,QAAI,OAAO,SAAS,UAAU,aAAa;AAC1C,iBAAW,QAAQ,SAAS,OAAO;AAClC,aAAK;AAAA,UACJ,SAAS,MAAM,IAAI,EAAE;AAAA,UACrB,SAAS,MAAM,IAAI,EAAE;AAAA,UACrB,SAAS,MAAM,IAAI,EAAE;AAAA,QACtB;AAAA,MACD;AAAA,IACD;AAGA,QAAI,CAAC,KAAK,WAAW,KAAK,aAAa,WAAW,IAAI,MAAM,GAAG;AAE9D,WAAK,oBAAoB,SAAS;AAAA,IACnC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACN,SAAK,iBAAiB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,SAAK,iBAAiB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,UAAU,WAAW,QAAW;AACvC,SAAK,SAAS,WAAW;AACzB,QAAI,KAAK,SAAS,YAAY,GAAG;AAChC,WAAK,SAAS,eAAe;AAC7B,WAAK,SAAS,WAAW;AAAA,IAC1B,WAAW,CAAC,KAAK,SAAS,cAAc;AACvC,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,eAAe;AAAA,IAC9B;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,aAAa,MAAM,OAAO,gBAAgB;AACzC,SAAK,KAAK,IAAI,IAAI;AAAA,MACjB;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,KAAK;AAAA,MACL,QAAQ;AAAA,IACT;AAGA,QAAI,UAAU;AAEd,QAAI,OAAO,KAAK,iBAAiB,UAAU;AAC1C,aAAO;AAAA,IACR;AAEA,QAAI,SAAS,MAAM;AAClB,cAAQ,CAAC;AAET,aAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM;AAChD,cAAM,CAAC,IAAI;AAAA,MACZ,CAAC;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,MAAM,MAAM,QAAQ,IAAI,KAAK,KAAK;AACjD,YAAM,QAAQ,MAAM,CAAC;AACrB,UAAI;AACJ,UAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC3D,sBAAc;AAAA,UACb,MAAM;AAAA,UACN,OAAO,kBAAkB,KAAK;AAAA,QAC/B;AAAA,MACD,OAAO;AACN,sBAAc;AAAA,MACf;AACA,YAAM,kBAAkB,YAAY;AACpC,UAAI,OAAO,oBAAoB,UAAU;AACxC,YAAI,OAAO,KAAK,aAAa,eAAe,MAAM,aAAa;AAE9D,eAAK,KAAK,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO;AAAA,YAClC,CAAC;AAAA,YACD,KAAK,aAAa,eAAe;AAAA,YACjC;AAAA,UACD;AACA;AAAA,QACD;AAAA,MACD,OAAO;AAEN,YAAI,KAAK,OAAO,UAAU,EAAE,SAAS,aAAa,GAAG;AACpD,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD,OAAO;AACN,eAAK,KAAK,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO;AAAA,YAClC,CAAC;AAAA,YACD,KAAK,aAAa,KAAK,aAAa,eAAe,CAAC;AAAA,YACpD;AAAA,UACD;AACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,SAAK,KAAK,IAAI,EAAE,SAAS;AAEzB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCA,oBAAoB,MAAM,WAAW,cAAc,OAAO;AACzD,QAAI,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa;AAC3C,UAAI,CAAC,KAAK,mBAAmB,IAAI,GAAG;AACnC,aAAK,QAAQ,OAAO;AACpB,aAAK,QAAQ,SAAS,KAAK,KAAK,KAAK,QAAQ,IAAI,EAAE;AACnD,YAAI,OAAO,cAAc,UAAU;AAClC,eAAK,YAAY,KAAK,oBAAoB;AAAA,YACzC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD,WAAW,OAAO,cAAc,YAAY;AAC3C,eAAK,YAAY;AAAA,QAClB,OAAO;AACN,eAAK,YAAY;AAAA,QAClB;AACA,aAAK,kBAAkB,CAAC;AACxB,YAAI,CAAC,aAAa;AACjB,eAAK,KAAK;AAAA,QACX;AACA,aAAK,UAAU;AAAA,MAChB;AAAA,IACD,OAAO;AACN,YAAM,IAAI,MAAM,mBAAmB,OAAO,eAAe;AAAA,IAC1D;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,MAAM;AACtB,QAAI,OAAO,SAAS,eAAe,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa;AAC1E,WAAK,KAAK,IAAI,EAAE,OAAO,QAAQ;AAAA,IAChC,OAAO;AACN,WAAK,KAAK,KAAK,QAAQ,IAAI,EAAE,OAAO,QAAQ;AAAA,IAC7C;AACA,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,mBAAmB,MAAM;AACxB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,QAAQ;AAEjB,SAAK,QAAQ,KAAK,OAAO,WAAW,MAAM;AAE1C,SAAK,QAAQ,OAAO,KAAK,OAAO,MAAM;AAEtC,SAAK,QAAQ,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAEvE,SAAK,QAAQ,KAAK,QAAQ,QAAQ,OAAO;AACzC,SAAK,SAAS,KAAK,QAAQ,SAAS,OAAO;AAE3C,QAAI,OAAO,aAAa;AACvB,WAAK,YAAY;AAAA,QAChB,KAAK,MAAM,KAAK,OAAO,YAAY,OAChC,IAAI,OAAO,YAAY,IACvB,OAAO,YAAY;AAAA,QACtB,KAAK,MAAM,KAAK,OAAO,YAAY,OAChC,IAAI,OAAO,YAAY,IACvB,OAAO,YAAY;AAAA,MACvB;AAAA,IACD;AAEA,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAkB,QAAQ,GAAG;AAC5B,SAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ;AACxC,WAAO,KAAK;AAAA,MACX,KAAK,+BAA+B,KAAK,QAAQ,GAAG;AAAA,IACrD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,2BAA2B;AAC1B,WAAO,KAAK,QAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,+BAA+B,IAAI;AAClC,WAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,EAAE,OAAO,EAAE;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,IAAI;AAEV,QAAI,KAAK,SAAS;AACjB,UAAI,KAAK,gBAAgB;AACxB,aAAK,MAAM,MAAM;AAAA,MAClB,WAAW,KAAK,MAAM,QAAQ;AAC7B,aAAK,MAAM,KAAK;AAAA,MACjB;AACA,WAAK,UAAU,CAAC,KAAK,MAAM;AAAA,IAC5B,OAAO;AAEN,UAAI,CAAC,KAAK,kBAAkB,KAAK,QAAQ,SAAS,GAAG;AACpD,YAAI,WAAW,KAAK;AAAA,UACnB,KAAK,QAAQ;AAAA,QACd,EAAE;AACF,aAAK,MAAM;AACX,eAAO,KAAK,MAAM,UAAU;AAC3B,eAAK,UAAU;AACf,eAAK,MAAM;AAEX,gBAAM,YACL,KAAK,QAAQ,SAAS,IAAI,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAC/D,eAAK,kBAAkB,SAAS;AAGhC,cAAI,KAAK,QAAQ,QAAQ,GAAG;AAC3B,gBAAI,OAAO,KAAK,YAAY,YAAY;AACvC,mBAAK,QAAQ;AAAA,YACd;AACA,gBAAI,OAAO,KAAK,cAAc,YAAY;AAEzC,kBAAI,KAAK,UAAU,MAAM,OAAO;AAE/B,qBAAK,kBAAkB,KAAK,QAAQ,SAAS,CAAC;AAG9C,qBAAK,MAAM;AACX;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAEA,qBAAW,KAAK;AAAA,YACf,KAAK,QAAQ;AAAA,UACd,EAAE;AAAA,QACH;AAAA,MACD;AAAA,IACD;AAGA,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,SAAS,YAAY;AAC1B,UAAI,KAAK,SAAS,WAAW,GAAG;AAC/B,YAAI,OAAO,KAAK,SAAS,aAAa,YAAY;AACjD,eAAK,SAAS,SAAS;AAAA,QACxB;AACA,aAAK,QAAQ,EAAE;AAAA,MAChB;AACA,WAAK,UAAU;AAAA,IAChB;AAEA,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKE,WAAU;AAEd,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,SAAS,QAAQ,CAAC,KAAK,SAAS;AACrC,UAAI,CAAC,KAAK,SAAS,OAAO;AACzB;AAAA,MACD;AAAA,IACD;AAGA,UAAM,QAAQ,KAAK;AAGnB,QAAI,OAAO,KAAK,IAAI;AACpB,UAAM,OAAO,KAAK,IAAI;AAEtB,QAAI,IAAI,MAAM;AACd,QAAI,IAAI,MAAM;AAGd,UAAM,eAAe,MAAM;AAC3B,UAAM,WAAW,KAAK;AAGtB,QAAI,MAAM,UAAU,GAAG;AACtB,MAAAA,UAAS,UAAU,CAAC,MAAM,CAAC,IAAI;AAC/B,MAAAA,UAAS,OAAO,MAAM,KAAK;AAC3B,cAAQ;AACR,UAAI,MAAM;AACV,UAAI,MAAM;AAAA,IACX;AAEA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,SAAS,IAAI,aAAa;AAAA;AAAA,MAC1B,SAAS,IAAI,aAAa;AAAA;AAAA,MAC1B;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,iBAAa,QAAQ,KAAK,MAAM;AAChC,SAAK,SAAS;AACd,QAAI,KAAK,SAAS;AACjB,WAAK,yBAAyB;AAC9B,WAAK,MAAM,UAAU;AACrB,WAAK,MAAM,MAAM;AACjB,WAAK,MAAM,cAAc;AAAA,IAC1B;AACA,SAAK,QAAQ;AACb,UAAM,QAAQ;AAAA,EACf;AACD;;;ACpsBA,IAAM,UAAU,IAAI,SAAS;AAK7B,IAAqB,WAArB,cAAsC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,YAAY,MAAM,MAAM,MAAM,MAAM;AACnC,UAAM,MAAM,MAAM,OAAO,MAAM,OAAO,IAAI;AAW1C,SAAK,OAAO;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,MAAM;AAAA,IACP;AAMA,SAAK,SAAS,WAAW,IAAI;AAO7B,SAAK,eAAe;AAQpB,SAAK,UAAU;AAOf,SAAK,OAAO;AAOZ,SAAK,MAAM;AAOX,SAAK,mBAAmB,IAAI,SAAS;AAOrC,SAAK,sBAAsB,IAAI,SAAS;AAGxC,SAAK,SAAS,IAAI,SAAS;AAG3B,SAAK,SAAS;AAGd,SAAK,cAAc,KAAK,KAAK;AAM7B,SAAK,SAAS;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,MAAM,KAAK,KAAK;AAAA,MAChB,YAAY;AAAA,IACb;AAMA,SAAK,WAAW;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAMA,SAAK,UAAU;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAGA,SAAK,OAAO;AAGZ,SAAK,YAAY,KAAK,QAAQ,GAAG,KAAK,SAAS,CAAC;AAGhD,SAAK,YAAY,IAAI,GAAG,CAAC;AAGzB,SAAK,cAAc;AAEnB,SAAK,OAAO,UAAU,MAAM,MAAM,MAAM,IAAI;AAG5C,SAAK,wBAAwB;AAG7B,iBAAa,YAAY,YAAY,KAAK,MAAM,KAAK,IAAI,CAAC;AAE1D,iBAAa,YAAY,iBAAiB,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAMA,0BAA0B;AACzB,SAAK,iBAAiB;AAAA,MACrB;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EACD;AAAA;AAAA,EAGA,SAAS,QAAQ;AAChB,QAAI,UAAU,KAAK,IAAI;AACvB,QAAI,OAAO,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,OAAO;AAChD,gBAAU,KAAK;AAAA,QACd,OAAO,IAAI,KAAK,SAAS;AAAA,QACzB,KAAK,OAAO,QAAQ,KAAK;AAAA,MAC1B;AAAA,IACD,WAAW,OAAO,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG;AACvD,gBAAU,KAAK,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,IAAI;AAAA,IACpE;AACA,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,SAAS,QAAQ;AAChB,QAAI,UAAU,KAAK,IAAI;AACvB,QAAI,OAAO,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ;AACjD,gBAAU,KAAK;AAAA,QACd,OAAO,IAAI,KAAK,SAAS;AAAA,QACzB,KAAK,OAAO,SAAS,KAAK;AAAA,MAC3B;AAAA,IACD,WAAW,OAAO,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG;AACvD,gBAAU,KAAK,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,GAAG;AAAA,IACnE;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAI,GAAG,IAAI,GAAG;AAEnB,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,IAAI;AAGb,SAAK,SAAS;AAGd,SAAK,eAAe;AACpB,SAAK,UAAU;AAGf,SAAK,iBAAiB,SAAS;AAC/B,SAAK,oBAAoB,SAAS,EAAE,OAAO;AAG3C,SAAK,wBAAwB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,GAAG,GAAG;AACjB,QAAI,OAAO,KAAK,aAAa,aAAa;AACzC,WAAK,WAAW,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC;AAAA,IACpC;AAGA,SAAK,SAAS,IAAI;AAAA,MACjB,CAAC,GAAG,KAAK,QAAQ,KAAK;AAAA,MACtB,CAAC,GAAG,KAAK,SAAS,KAAK,IAAI,IAAI;AAAA,IAChC;AACA,SAAK,SAAS,OAAO,GAAG,CAAC;AAEzB,SAAK,eAAe;AAGpB,SAAK,aAAa;AAElB,SAAK,eAAe;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAG,GAAG;AAEZ,UAAM,OAAO,GAAG,CAAC;AAGjB,SAAK,eAAe;AAGpB,SAAK,UAAU,GAAG,GAAG,GAAG,CAAC;AACzB,SAAK,YAAY,IAAI,GAAG,IAAI,CAAC;AAC7B,SAAK,OAAO;AACZ,SAAK,eAAe;AAGpB,SAAK,wBAAwB;AAG7B,iBAAa,KAAK,mBAAmB,KAAK,OAAO,KAAK,MAAM;AAE5D,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,GAAG,GAAG,GAAG,GAAG;AACrB,SAAK,eAAe;AACpB,SAAK,OAAO,UAAU,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACxC,SAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAClC,SAAK,OAAO;AACZ,SAAK,eAAe;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,QAAQ,MAAM,SAAS;AAC7B,QAAI,kBAAkB,YAAY;AACjC,WAAK,SAAS,OAAO;AAAA,IACtB,WAAW,kBAAkB,YAAY,kBAAkB,UAAU;AACpE,WAAK,SAAS;AAAA,IACf,OAAO;AACN,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACxD;AAEA,SAAK,cAAc,OAAO,SAAS,cAAc,KAAK,KAAK,OAAO;AAElE,SAAK,eAAe;AAEpB,QAAI,OAAO,YAAY,UAAU;AAChC,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK,UAAU,MAAM,SAAS,GAAK,CAAG;AAAA,IACvC;AAGA,SAAK,aAAa;AAElB,SAAK,eAAe;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACV,SAAK,SAAS;AACd,SAAK,cAAc,KAAK,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAK,GAAG,GAAG;AACV,SAAK,OAAO,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAG,GAAG;AACZ,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,KAAK,KAAK,IAAI;AAEpB,SAAK,IAAI,IAAI,MAAM,GAAG,KAAK,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK;AACtE,SAAK,IAAI,IAAI,MAAM,GAAG,KAAK,OAAO,KAAK,KAAK,OAAO,SAAS,KAAK,MAAM;AAGvE,QAAI,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,GAAG;AAC3C,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA,EAGA,eAAe;AACd,QAAI,KAAK,QAAQ;AAChB,cAAQ,KAAK,KAAK,GAAG;AAErB,cAAQ,KAAK,aAAa;AAAA,QACzB,KAAK,KAAK,KAAK;AAEd;AAAA,QAED,KAAK,KAAK,KAAK;AACd,kBAAQ,IAAI,KAAK,SAAS,KAAK,MAAM;AACrC;AAAA,QAED,KAAK,KAAK,KAAK;AACd,kBAAQ,IAAI,KAAK,SAAS,KAAK,MAAM;AACrC;AAAA,QAED,KAAK,KAAK,KAAK;AACd,kBAAQ,IAAI,KAAK,SAAS,KAAK,MAAM;AACrC,kBAAQ,IAAI,KAAK,SAAS,KAAK,MAAM;AACrC;AAAA,QAED;AACC;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,IAAI,OAAO,OAAO,GAAG;AAE9B,YAAI,KAAK,iBAAiB,QAAQ,KAAK,UAAU,GAAK;AAErD,cACC,YAAY,QAAQ,GAAG,KAAK,IAAI,GAAG,CAAC,KACpC,YAAY,QAAQ,GAAG,KAAK,IAAI,GAAG,CAAC,GACnC;AACD,iBAAK,IAAI,KAAK,OAAO;AACrB;AAAA,UACD,OAAO;AACN,iBAAK,IAAI,KAAK,SAAS,KAAK,OAAO;AAAA,UACpC;AAAA,QACD,OAAO;AACN,eAAK,IAAI,KAAK,OAAO;AAAA,QACtB;AACA,aAAK,UAAU;AAAA,MAChB;AAAA,IACD;AAAA,EACD;AAAA;AAAA,EAGA,OAAO,IAAI;AAEV,SAAK,aAAa,EAAE;AAEpB,QAAI,KAAK,OAAO,WAAW,GAAG;AAC7B,WAAK,OAAO,YAAY;AACxB,UAAI,KAAK,OAAO,YAAY,GAAG;AAC9B,aAAK,OAAO,WAAW;AACvB,aAAK,OAAO,QAAQ;AACpB,YAAI,OAAO,KAAK,OAAO,eAAe,YAAY;AACjD,eAAK,OAAO,WAAW;AAAA,QACxB;AAAA,MACD,OAAO;AACN,YACC,KAAK,OAAO,SAAS,KAAK,KAAK,QAC/B,KAAK,OAAO,SAAS,KAAK,KAAK,YAC9B;AACD,eAAK,OAAO,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;AAAA,QACrD;AACA,YACC,KAAK,OAAO,SAAS,KAAK,KAAK,QAC/B,KAAK,OAAO,SAAS,KAAK,KAAK,UAC9B;AACD,eAAK,OAAO,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;AAAA,QACrD;AAAA,MACD;AAEA,WAAK,UAAU;AAAA,IAChB;AAEA,QAAI,KAAK,YAAY,MAAM;AAE1B,mBAAa,KAAK,mBAAmB,KAAK,GAAG;AAAA,IAC9C;AAGA,QAAI,KAAK,QAAQ,SAAS,QAAQ,KAAK,SAAS,SAAS,MAAM;AAC9D,WAAK,UAAU;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,iBAAiB,WAAW,GAAG;AACxC,WAAK,oBAAoB,KAAK,KAAK,gBAAgB,EAAE,OAAO;AAAA,IAC7D,OAAO;AAEN,WAAK,oBAAoB,SAAS;AAAA,IACnC;AAEA,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,UAAU,MAAM,YAAY,OAAO;AACnD,QAAI,KAAK,OAAO,aAAa,KAAK,UAAU,MAAM;AACjD,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,WAAW;AACvB,WAAK,OAAO,OAAO,QAAQ,KAAK,KAAK;AACrC,WAAK,OAAO,aACX,OAAO,eAAe,aAAa,aAAa;AAAA,IAClD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,OAAO,WAAW,KAAM,YAAY;AAC3C,SAAK,SAAS,QAAQ,UAAU,IAAI,KAAK;AACzC,SAAK,SAAS,QAAQ,UACpB,IAAI,KAAK,SAAS,KAAK,EACvB,GAAG,EAAE,OAAO,EAAI,GAAG,EAAE,SAAS,CAAC,EAC/B,WAAW,cAAc,IAAI;AAC/B,SAAK,SAAS,MAAM,eAAe;AACnC,SAAK,SAAS,MAAM,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,OAAO,WAAW,KAAM,YAAY;AAC1C,SAAK,QAAQ,QAAQ,UAAU,IAAI,KAAK;AACxC,UAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,SAAK,QAAQ,MAAM,QAAQ;AAC3B,SAAK,QAAQ,QAAQ,UACnB,IAAI,KAAK,QAAQ,KAAK,EACtB,GAAG,EAAE,OAAO,OAAO,GAAG,EAAE,SAAS,CAAC,EAClC,WAAW,cAAc,IAAI;AAC/B,SAAK,QAAQ,MAAM,eAAe;AAClC,SAAK,QAAQ,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,QAAQ;AACf,UAAM,SAAS,OAAO,UAAU;AAChC,SAAK;AAAA,MACJ,OAAO,OAAO,OAAO,QAAQ,IAAI,KAAK,QAAQ;AAAA,MAC9C,OAAO,MAAM,OAAO,SAAS,IAAI,KAAK,SAAS;AAAA,IAChD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAK,WAAW,IAAI,UAAU;AACvC,QAAI,aAAa,QAAQ,IAAI,aAAa,MAAM;AAE/C,aAAO,SAAS,SAAS,IAAI,UAAU,CAAC;AAAA,IACzC,OAAO;AAEN,aAAO,IAAI,UAAU,EAAE,SAAS,IAAI;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,GAAG,GAAG,GAAG;AAErB,QAAI,KAAK,aAAa,IAAI;AAC1B,MAAE,IAAI,GAAG,CAAC,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,GAAG;AAC5C,QAAI,CAAC,KAAK,iBAAiB,WAAW,GAAG;AACxC,WAAK,oBAAoB,MAAM,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,GAAG,GAAG,GAAG;AAErB,QAAI,KAAK,aAAa,IAAI;AAC1B,MAAE,IAAI,GAAG,CAAC;AACV,QAAI,CAAC,KAAK,iBAAiB,WAAW,GAAG;AACxC,WAAK,iBAAiB,MAAM,CAAC;AAAA,IAC9B;AACA,WAAO,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,GAAG;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAOC,WAAU;AAEhB,QAAI,KAAK,QAAQ,OAAO;AAEvB,MAAAA,UAAS,KAAK;AAEd,MAAAA,UAAS,eAAe;AACxB,MAAAA,UAAS,SAAS,KAAK,QAAQ,KAAK;AACpC,MAAAA,UAAS,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAC/C,MAAAA,UAAS,QAAQ;AAEjB,UAAI,KAAK,QAAQ,MAAM,UAAU,GAAK;AACrC,aAAK,QAAQ,QAAQ;AACrB,kBAAU,QAAQ,KAAK,QAAQ,KAAK;AACpC,aAAK,QAAQ,QAAQ;AAAA,MACtB;AAAA,IACD;AAGA,QAAI,KAAK,SAAS,OAAO;AAExB,MAAAA,UAAS,KAAK;AAEd,MAAAA,UAAS,eAAe;AACxB,MAAAA,UAAS,SAAS,KAAK,SAAS,KAAK;AACrC,MAAAA,UAAS,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAC/C,MAAAA,UAAS,QAAQ;AAEjB,UAAI,KAAK,SAAS,MAAM,UAAU,GAAK;AACtC,aAAK,SAAS,QAAQ;AACtB,kBAAU,QAAQ,KAAK,SAAS,KAAK;AACrC,aAAK,SAAS,QAAQ;AAAA,MACvB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAKA,WAAU,WAAW;AACzB,UAAM,aAAa,KAAK,IAAI,IAAI,KAAK,OAAO;AAC5C,UAAM,aAAa,KAAK,IAAI,IAAI,KAAK,OAAO;AAG5C,cAAU,iBAAiB,UAAU,CAAC,YAAY,CAAC,UAAU;AAG7D,IAAAA,UAAS,cAAc,KAAK,gBAAgB;AAG5C,IAAAA,UAAS,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAE/C,SAAK,QAAQA,SAAQ;AAErB,cAAU,QAAQA,WAAU,IAAI;AAIhC,cAAU,KAAKA,WAAU,IAAI;AAG7B,SAAK,OAAOA,SAAQ;AAEpB,cAAU,SAASA,WAAU,IAAI;AAEjC,SAAK,SAASA,SAAQ;AAGtB,cAAU,iBAAiB,UAAU,YAAY,UAAU;AAAA,EAC5D;AACD;;;AC5qBA,IAAI;AAGJ,IAAM,mBAAmB;AAAA,EACxB,SAAS,CAAC;AACX;AAQA,IAAqB,QAArB,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1B,YAAY,UAAU;AAUrB,SAAK,UAAU,oBAAI,IAAI;AAuBvB,SAAK,SAAS,oBAAI,IAAI;AAWtB,SAAK,eAAe,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC;AASxC,SAAK,WAAW,OAAO,OAAO,kBAAkB,YAAY,CAAC,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAEP,SAAK,SAAS,QAAQ,QAAQ,CAAC,WAAW;AACzC,WAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AAAA,IACrC,CAAC;AAGD,QAAI,KAAK,QAAQ,IAAI,SAAS,MAAM,OAAO;AAC1C,UAAI,OAAO,mBAAmB,aAAa;AAC1C,cAAM,QAAQ,SAAS;AACvB,cAAM,SAAS,SAAS;AAExB,yBAAiB,IAAI,SAAS,GAAG,GAAG,OAAO,MAAM;AAAA,MAClD;AACA,WAAK,QAAQ,IAAI,WAAW,cAAc;AAAA,IAC3C;AAGA,iBAAa,KAAK,aAAa,IAAI;AAGnC,SAAK,aAAa,MAAM,MAAM,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,IAAI;AACV,QAAI,UAAU;AAId,SAAK,QAAQ,QAAQ,CAAC,WAAW;AAChC,UAAI,OAAO,OAAO,EAAE,MAAM,MAAM;AAC/B,kBAAU;AAAA,MACX;AAAA,IACD,CAAC;AAGD,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,UAAI,MAAM,OAAO,EAAE,MAAM,MAAM;AAC9B,kBAAU;AAAA,MACX;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,KAAKC,WAAU,OAAO;AAErB,SAAK,QAAQ,QAAQ,CAAC,WAAW;AAEhC,aAAO,KAAKA,WAAU,KAAK;AAG3B,UAAI,KAAK,aAAa,UAAU,GAAG;AAClC,QAAAA,UAAS,KAAK;AAEd,aAAK,OAAO,QAAQ,CAAC,UAAU;AAE9B,UAAAA,UAAS,QAAQ,MAAM,eAAe,GAAG,IAAI;AAAA,QAC9C,CAAC;AAED,QAAAA,UAAS,SAAS,KAAK,YAAY;AACnC,QAAAA,UAAS,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAEnD,QAAAA,UAAS,UAAU;AACnB,QAAAA,UAAS,QAAQ;AAAA,MAClB;AAGA,WAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,cAAM,QAAQA,WAAU,KAAK;AAC7B,cAAM,KAAKA,WAAU,KAAK;AAC1B,cAAM,SAASA,WAAU,KAAK;AAAA,MAC/B,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,SAAK,QAAQ,MAAM;AAEnB,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,YAAM,QAAQ;AAAA,IACf,CAAC;AACD,SAAK,OAAO,MAAM;AAElB,SAAK,eAAe,MAAM,MAAM,SAAS;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eAAe;AAEd,QAAI,OAAO,KAAK,SAAS,iBAAiB,YAAY;AACrD,WAAK,SAAS,aAAa,MAAM,MAAM,SAAS;AAAA,IACjD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB;AAEhB,QAAI,OAAO,KAAK,SAAS,mBAAmB,YAAY;AACvD,WAAK,SAAS,eAAe,MAAM,MAAM,SAAS;AAAA,IACnD;AAAA,EACD;AACD;A;;;;;AChNA,IAAM,cAAN,cAA0B,WAAW;AAAA,EACpC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,GAAG,GAAG,GAAG,GAAG;AACvB,UAAM,GAAG,GAAG,GAAG,CAAC;AAEhB,SAAK,YAAY;AACjB,SAAK,YAAY,IAAI,GAAG,CAAC;AAEzB,SAAK,yBAAyB,KAAK,iBAAiB,KAAK,IAAI;AAC7D,SAAK,eAAe,KAAK,OAAO,KAAK,IAAI;AAEzC,iBAAa,YAAY,iBAAiB,KAAK,sBAAsB;AACrE,iBAAa,YAAY,mBAAmB,KAAK,YAAY;AAE7D,SAAK,YAAY,IAAI,GAAG,CAAC;AAGzB,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,UAAU;AAC1B,SAAK,WAAW,CAAC,EAAE,WAAW,KAAK;AACnC,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAKC,WAAU,UAAU;AAExB,IAAAA,UAAS,SAAS,OAAO;AACzB,IAAAA,UAAS;AAAA,MACR,KAAK,IAAI;AAAA,MACT,SAAS;AAAA,MACTA,UAAS;AAAA,MACT,KAAK,YAAY;AAAA,IAClB;AAEA,IAAAA,UAAS,SAAS,SAAS;AAC3B,IAAAA,UAAS;AAAA,MACR,KAAK,IAAI;AAAA,MACT,SAAS;AAAA,MACT,KAAK;AAAA,MACL,KAAK,YAAY;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAChB,iBAAa,eAAe,iBAAiB,KAAK,sBAAsB;AACxE,iBAAa,eAAe,mBAAmB,KAAK,YAAY;AAAA,EACjE;AACD;AAMA,IAAM,uBAAN,cAAmC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,eAAe;AACd,UAAM,YAAY;AAGlB,SAAK,MAAM,gBAAgB,SAAS,SAAS;AAG7C,SAAK,MAAM;AAAA,MACV,IAAI,YAAY,GAAG,SAAS,SAAS,GAAG,SAAS,OAAO,SAAS;AAAA,MACjE;AAAA,IACD;AAGA,IAAAC,MAAK,EAAE,MAAM,gBAAgB,MAAM,SAAS,KAAK,qBAAS,GAAG,MAAM;AAElE,WAAK,MAAM;AAAA,QACV,IAAI,OAAO,SAAS,QAAQ,GAAG,SAAS,SAAS,GAAG;AAAA,UACnD,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,QACd,CAAC;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAEhB,IAAAC,QAAO,EAAE,MAAM,gBAAgB,MAAM,QAAQ,CAAC;AAAA,EAC/C;AACD;AAEA,IAAO,wBAAQ;;;AC5Gf,IAAI,SAAS;AAGb,IAAI,eAAe;AAGnB,IAAI,YAAY;AAGhB,IAAM,UAAU,CAAC;AAGjB,IAAM,QAAQ;AAAA,EACb,OAAO;AAAA,EACP,UAAU;AACX;AAIA,IAAI,oBAAoB;AAGxB,IAAI,aAAa;AAGjB,IAAI,aAAa;AAKjB,SAAS,gBAAgB;AAExB,MAAI,iBAAiB,MAAM,WAAW,IAAI;AAEzC,mBAAe,WAAW,sBAAsB,YAAY;AAAA,EAC7D;AACD;AAMA,SAAS,iBAAiB;AAEzB,MAAI,aAAa,WAAW,IAAI;AAC/B,gBAAY;AAAA,EACb;AACD;AAMA,SAAS,gBAAgB;AAExB,cAAY;AACb;AAOA,SAAS,aAAa,MAAM;AAC3B,eAAa,KAAK,MAAM,IAAI;AAE5B,MAAI,iBAAiB,IAAI;AACxB,mBAAe,WAAW,sBAAsB,YAAY;AAAA,EAC7D;AACD;AAMA,SAAS,eAAe;AAEvB,aAAW,qBAAqB,YAAY;AAC5C,iBAAe;AAChB;AAMA,SAAS,aAAaC,QAAO;AAE5B,eAAa;AAGb,MAAI,QAAQ,MAAM,GAAG;AAEpB,YAAQ,MAAM,EAAE,MAAM,QAAQ;AAAA,EAC/B;AAEA,MAAI,QAAQA,MAAK,GAAG;AAEnB,aAASA;AAGT,YAAQ,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,EAAE,OAAO,UAAU;AAInE,kBAAc;AAGd,iBAAa,KAAK,YAAY;AAG9B,QAAI,mBAAmB;AACtB,wBAAkB;AAAA,IACnB;AAAA,EACD;AACD;AAGA,aAAa,gBAAgB,MAAM,MAAM;AAExC,QAAM,IAAI,MAAM,SAAS,IAAI,sBAAqB,CAAC;AAEnD,QAAM,IAAI,MAAM,SAAS,IAAI,MAAM,CAAC;AAEpC,eAAa,gBAAgB,YAAY,MAAM;AAC9C,UAAM,OAAO,MAAM,SAAS,IAAI;AAAA,EACjC,CAAC;AACF,CAAC;AAMD,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQN,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQN,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASN,KAAKC,cAAa,OAAO;AAExB,QAAI,WAAW,KAAK,WAAW,KAAK,UAAU,GAAG;AAEhD,mBAAa;AAGb,UAAIA,gBAAe,MAAM;AACxB,QAAAA,YAAW;AAAA,MACZ;AAGA,mBAAa,WAAW,YAAY,IAAI;AAGxC,mBAAa,KAAK,UAAU;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,OAAO;AAEpB,QAAI,WAAW,KAAK,WAAW,CAAC,KAAK,SAAS,GAAG;AAEhD,oBAAc;AAEd,UAAI,UAAU,MAAM;AACnB,mBAAW;AAAA,MACZ;AAGA,mBAAa,WAAW,YAAY,IAAI;AAGxC,mBAAa,KAAK,WAAW;AAAA,IAC9B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,QAAQ,OAAO;AACtB,QAAI,CAAC,KAAK,UAAU,GAAG;AAEtB,oBAAc;AAEd,UAAI,UAAU,MAAM;AACnB,oBAAY;AAAA,MACb;AAGA,mBAAa,WAAW,YAAY,IAAI,IAAI;AAG5C,mBAAa,KAAK,eAAe,UAAU;AAAA,IAC5C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,QAAQ,OAAO;AACrB,QAAI,KAAK,SAAS,GAAG;AAEpB,qBAAe;AAEf,UAAI,UAAU,MAAM;AACnB,oBAAY;AAAA,MACb;AAGA,mBAAa,WAAW,YAAY,IAAI,IAAI;AAG5C,mBAAa,KAAK,cAAc,UAAU;AAAA,IAC3C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY;AACX,WAAO,iBAAiB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW;AACV,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+CA,IAAID,QAAO,OAAO,QAAQ,OAAO;AAChC,QAAI,EAAE,iBAAiB,QAAQ;AAC9B,YAAM,IAAI,MAAM,QAAQ,iCAAiC;AAAA,IAC1D;AACA,YAAQA,MAAK,IAAI,CAAC;AAClB,YAAQA,MAAK,EAAE,QAAQ;AACvB,YAAQA,MAAK,EAAE,aAAa;AAE5B,QAAI,UAAU,MAAM;AACnB,WAAK,OAAOA,MAAK;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAIA,SAAQ,QAAQ;AACnB,QAAI,OAAO,QAAQA,MAAK,MAAM,aAAa;AAC1C,aAAO,QAAQA,MAAK,EAAE;AAAA,IACvB,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU;AACT,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,QAAQ,OAAO,UAAU;AACnC,QAAI,WAAW,QAAQ;AACtB,YAAM,QAAQ;AACd,YAAM,WAAW;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAcA,QAAOE,SAAQ;AAC5B,YAAQF,MAAK,EAAE,aAAaE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAOF,QAAO,cAAc,OAAO;AAElC,QAAI,OAAO,QAAQA,MAAK,MAAM,aAAa;AAC1C,YAAM,IAAI,MAAM,gCAAgCA,SAAQ,GAAG;AAAA,IAC5D;AAGA,QAAI,CAAC,KAAK,UAAUA,MAAK,GAAG;AAC3B,mBAAa;AACb,UAAI,UAAU,SAAS,GAAG;AAEzB,qBAAa,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC;AAAA,MACrD;AAEA,UAAI,MAAM,YAAY,QAAQA,MAAK,EAAE,YAAY;AAChD,4BAAoB,MAAM;AACzB,eAAK,SAAS,QAAQ,MAAM,OAAO,MAAM,QAAQ;AAAA,QAClD;AACA,aAAK,SAAS,OAAO,MAAM,OAAO,MAAM,UAAU,WAAY;AAC7D,gBAAM,cAAc,MAAMA,MAAK;AAAA,QAChC,CAAC;AAAA,MACF,OAEK;AAGJ,YAAI,gBAAgB,MAAM;AACzB,uBAAaA,MAAK;AAAA,QACnB,OAAO;AACN,gBAAM,cAAc,MAAMA,MAAK;AAAA,QAChC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAUA,QAAO;AAChB,WAAO,WAAWA;AAAA,EACnB;AACD;AACA,IAAO,gBAAQ;;;AC7gBf,IAAM,QAAN,MAAY;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EASA;AAAA,EAEA,cAAc;AAOb,SAAK,OAAO;AAMZ,SAAK,MAAM;AAOX,SAAK,SAAS;AAOd,SAAK,gBAAgB;AAGrB,SAAK,aAAa;AAClB,SAAK,aAAa;AAGlB,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,QAAQ;AAEb,SAAK,OAAO;AACZ,SAAK,UAAU;AAGf,SAAK,SAAS,CAAC;AACf,SAAK,UAAU;AAGf,iBAAa,gBAAgB,MAAM,MAAM;AAExC,WAAK,MAAM;AACX,WAAK,MAAM,KAAK,OAAO;AAEvB,mBAAa,YAAY,oBAAoB,CAAC,SAAS;AACtD,aAAK,OAAO,IAAI;AAAA,MACjB,CAAC;AAAA,IACF,CAAC;AAGD,iBAAa,YAAY,cAAc,MAAM;AAC5C,WAAK,MAAM;AAAA,IACZ,CAAC;AACD,iBAAa,YAAY,eAAe,MAAM;AAC7C,WAAK,MAAM;AAAA,IACZ,CAAC;AACD,iBAAa,YAAY,cAAc,MAAM;AAC5C,WAAK,MAAM;AAAA,IACZ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAEP,SAAK,OAAO,KAAK,MAAM,WAAW,YAAY,IAAI;AAClD,SAAK,QAAQ;AAEb,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,OAAO,KAAK,KAAK,MAAO,KAAK,MAAM;AAExC,SAAK,UAAW,MAAO,KAAK,SAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WACC,IACA,OACA,cACG,MACF;AACD,SAAK,OAAO,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS,EAAE,KAAK;AAAA,MAChB,WAAW,aAAa;AAAA,MACxB;AAAA,IACD,CAAC;AACD,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,YACC,IACA,OACA,cACG,MACF;AACD,SAAK,OAAO,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS,EAAE,KAAK;AAAA,MAChB,WAAW,cAAc,QAAQ;AAAA,MACjC;AAAA,IACD,CAAC;AACD,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,WAAmB;AAC/B,QAAI,YAAY,GAAG;AAClB,YAAM,MAAM;AACX,aAAK,WAAW,SAAS;AAAA,MAC1B,GAAG,IAAI;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,YAAoB;AACjC,QAAI,aAAa,GAAG;AACnB,YAAM,MAAM;AACX,aAAK,WAAW,UAAU;AAAA,MAC3B,GAAG,IAAI;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,SAAK;AACL,SAAK,cAAc,KAAK;AACxB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC/B,WAAK,MAAM;AAAA,QACV,KAAK,MAAO,MAAO,KAAK,aAAc,KAAK,UAAU;AAAA,QACrD;AAAA,QACA,KAAK;AAAA,MACN;AACA,WAAK,aAAa;AAClB,WAAK,aAAa;AAAA,IACnB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,MAAc;AACpB,SAAK,OAAO,KAAK;AACjB,SAAK,MAAM;AACX,SAAK,QAAQ,KAAK,MAAM,KAAK;AAG7B,QAAI,KAAK,QAAQ,GAAG;AACnB,WAAK,QAAQ;AAAA,IACd;AAGA,SAAK,OACJ,KAAK,QAAQ,KAAK,WAAW,KAAK,gBAC/B,KAAK,QAAQ,KAAK,OAClB;AAEJ,SAAK,aAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWG,UAAiB;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC5C,UAAI,KAAK,OAAO,CAAC,EAAE,YAAYA,UAAS;AACvC,aAAK,OAAO,OAAO,GAAG,CAAC;AACvB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,eAAWC,UAAS,KAAK,QAAQ;AAChC,UAAI,EAAEA,OAAM,aAAa,cAAM,SAAS,IAAI;AAC3C,QAAAA,OAAM,WAAW,KAAK;AAAA,MACvB;AACA,UAAIA,OAAM,WAAWA,OAAM,OAAO;AACjC,QAAAA,OAAM,GAAG,GAAGA,OAAM,IAAI;AAEtB,YAAIA,OAAM,QAAQ;AACjB,UAAAA,OAAM,WAAWA,OAAM;AAAA,QACxB,OAAO;AACN,eAAK,WAAWA,OAAM,OAAO;AAAA,QAC9B;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAEA,IAAM,QAAQ,IAAI,MAAM;AAexB,IAAO,gBAAQ;;;ACnTf,IAAM,SAAS,IAAI,SAAS;AAK5B,IAAM,UAAN,cAAsB,OAAO;AAAA;AAAA;AAAA;AAAA,EAI5B,YAAY,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAEvC,UAAM;AAGN,SAAK,UAAU,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAOjC,SAAK,OAAO;AAOZ,SAAK,SAAS;AAOd,SAAK,QAAQ;AASb,SAAK,QAAQ;AAOb,SAAK,OAAO;AAOZ,SAAK,SAAS;AAOd,SAAK,YAAY;AAOjB,SAAK,QAAQ;AAOb,SAAK,QAAQ;AAOb,SAAK,UAAU;AAOf,SAAK,UAAU;AAOf,SAAK,YAAY;AAOjB,SAAK,YAAY;AAOjB,SAAK,YAAY;AAOjB,SAAK,SAAS;AAOd,SAAK,SAAS;AAOd,SAAK,SAAS;AAOd,SAAK,QAAQ;AAOb,SAAK,QAAQ;AAMb,SAAK,cAAc;AAMnB,SAAK,cAAc;AAMnB,SAAK,aAAa;AAMlB,SAAK,aAAa;AAMlB,SAAK,aAAa;AAMlB,SAAK,aAAa;AAOlB,SAAK,YAAY;AAMjB,SAAK,eAAe;AAMpB,SAAK,SAAS;AAGd,SAAK,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SACC,OACA,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,YAAY,GACX;AAED,SAAK,QAAQ;AAEb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,UAAU;AAGf,kBAAc,KAAK,OAAO,KAAK,OAAO,MAAM;AAC5C,SAAK,cAAc,KAAK,IAAI,OAAO;AACnC,SAAK,cAAc,KAAK,IAAI,OAAO;AAGnC,SAAK,eACJ,OAAO,WAAW,iBAAiB,eACnC,EAAE,iBAAiB,WAAW;AAE/B,SAAK,SAAS;AACd,SAAK,YAAY,MAAM,aAAa;AACpC,SAAK,YAAY,MAAM,aAAa;AAEpC,QAAI,MAAM,SAAS,SAAS;AAC3B,WAAK,YAAY,MAAM,aAAa;AACpC,WAAK,SAAS,MAAM,UAAU;AAC9B,WAAK,SAAS,MAAM,UAAU;AAC9B,WAAK,SAAS,MAAM,UAAU;AAAA,IAC/B,OAAO;AACN,WAAK,YAAY;AACjB,WAAK,SAAS;AACd,WAAK,SAAS;AACd,WAAK,SAAS;AAAA,IACf;AAEA,SAAK,YAAY;AAEjB,SAAK,YACJ,OAAO,MAAM,cAAc,cAAc,MAAM,YAAY;AAG5D,SAAK,SAAS,MAAM,UAAU;AAE9B,SAAK,OAAO,MAAM;AAGlB,QAAI,OAAO,KAAK,aAAa,aAAa;AACzC,WAAK,SAAS,aAAa,KAAK,aAAa,KAAK,aAAa,MAAM;AAAA,IACtE;AAGA,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AAGzB,QAAI,KAAK,iBAAiB,OAAO;AAEhC,WAAK,QAAQ,MAAM,SAAS;AAC5B,WAAK,SAAS,MAAM,UAAU;AAAA,IAC/B,WAAW,OAAO,MAAM,YAAY,UAAU;AAE7C,WAAK,QAAQ,MAAM,UAAU,KAAK;AAClC,WAAK,SAAS,MAAM,UAAU,KAAK;AAAA,IACpC,OAAO;AACN,WAAK,QAAQ,KAAK,SAAS;AAAA,IAC5B;AAAA,EACD;AACD;AAEA,IAAO,kBAAQ;;;ACxRf,IAAM,aAAa,CAAC;AAGpB,IAAM,gBAAgB,oBAAI,IAAI;AAG9B,IAAI;AAGJ,IAAI,qBAAqB;AAGzB,IAAI,gBAAgB;AAGpB,IAAI,kBAAkB,CAAC;AAGvB,IAAM,QAAQ,CAAC,OAAO;AACtB,IAAM,eAAe,CAAC,eAAe,aAAa,WAAW;AAC7D,IAAM,eAAe,CAAC,eAAe,aAAa,YAAY;AAC9D,IAAM,aAAa,CAAC,aAAa,WAAW,UAAU;AACtD,IAAM,iBAAiB,CAAC,iBAAiB,eAAe,aAAa;AACrE,IAAM,gBAAgB,CAAC,gBAAgB,cAAc,YAAY;AACjE,IAAM,eAAe,CAAC,eAAe,aAAa,WAAW;AAC7D,IAAM,gBAAgB,CAAC,gBAAgB,cAAc,YAAY;AAGjE,IAAM,mBAAmB;AAAA,EACxB,MAAM,CAAC;AAAA,EACP,aAAa,CAAC;AAAA,EACd,aAAa,CAAC;AAAA,EACd,WAAW,CAAC;AAAA,EACZ,eAAe,CAAC;AAAA,EAChB,cAAc,CAAC;AAAA,EACf,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAChB;AAGA,IAAM,iBAAiB;AAAA,EACtB,MAAM,CAAC;AAAA,EACP,aAAa,CAAC;AAAA,EACd,aAAa,CAAC;AAAA,EACd,WAAW,CAAC;AAAA,EACZ,eAAe,CAAC;AAAA,EAChB,cAAc,CAAC;AAAA,EACf,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAChB;AAGA,IAAM,iBAAiB;AAAA,EACtB,aAAa,CAAC;AAAA,EACd,aAAa,CAAC;AAAA,EACd,WAAW,CAAC;AAAA,EACZ,eAAe,CAAC;AAAA,EAChB,cAAc,CAAC;AAAA,EACf,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAChB;AAEA,IAAM,kBAAkB;AAAA,EACvB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AACf;AAMA,IAAM,mBAAmB,CAAC;AAM1B,SAAS,sBAAsB,WAAW,UAAU;AACnD,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,QAAI,aAAa,QAAQ,UAAU,CAAC,CAAC,MAAM,IAAI;AAC9C,yBAAmB,iBAAiB,UAAU,CAAC,GAAG,UAAU;AAAA,QAC3D,SAAS,mBAAmB;AAAA,MAC7B,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAMA,SAAS,qBAAqB;AAC7B,MAAI,CAAC,oBAAoB;AAExB,qBAAiB,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC;AAGpC,aAAS,IAAI,GAAG,IAAW,gBAAgB,KAAK;AAC/C,iBAAW,KAAK,IAAI,gBAAQ,CAAC;AAAA,IAC9B;AAEA,QAAI,uBAAuB,MAAM;AAEhC,2BAAqB,SAAS,UAAU;AAAA,IACzC;AAEA,QAAW,cAAc;AAExB,wBAAkB;AAAA,IACnB,OAAO;AAEN,wBAAkB;AAAA,IACnB;AACA,QAAW,SAAS,CAAQ,cAAc;AAEzC,wBAAkB,gBAAgB,OAAO,cAAc;AAAA,IACxD;AACA,0BAAsB,iBAAiB,cAAc;AAGrD,QAAI,OAAO,uBAAuB,aAAa;AAE9C,2BAAqB,CAAC,EAAE,MAAO,cAAM;AAAA,IACtC;AAEA,QAAW,cAAc,MAAM;AAC9B,MAAO,MAAM;AACb,yBAAmB;AAAA,QAClB,gBAAgB,CAAC;AAAA;AAAA,QACjB,MAAM;AACL,UAAO,MAAM;AAAA,QACd;AAAA,QACA,EAAE,SAAS,mBAAmB,MAAM;AAAA,MACrC;AAAA,IACD;AAGA,UAAM,SAAS,oBAAoB,iBAAiB,YAAY;AAChE,QAAI,qBAAqB,IAAI;AAC5B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,YAAI,gBAAgB,QAAQ,OAAO,CAAC,CAAC,MAAM,IAAI;AAC9C,6BAAmB;AAAA,YAClB,OAAO,CAAC;AAAA,YACR;AAAA,YACA,EAAE,SAAS,KAAK;AAAA;AAAA,UACjB;AAAA,QACD;AAAA,MACD;AAAA,IACD,OAAO;AACN,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,YAAI,gBAAgB,QAAQ,OAAO,CAAC,CAAC,MAAM,IAAI;AAC9C,6BAAmB;AAAA,YAClB,OAAO,CAAC;AAAA,YACR,SAAS,aAAa,kBAAkB;AAAA,YACxC,EAAE,SAAS,KAAK;AAAA;AAAA,UACjB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,mBAAe,kBAAkB;AAGjC,QAAW,uBAAuB;AACjC,iBAAW,SAAS;AAAA,QACnB;AAAA,QACA,MAAM;AAEL,mBACC,WAAW,SAAS,uBAAuB,KAAK,iBAAiB;AAElE,uBAAa,KAAK,mBAAmB,MAAM;AAAA,QAC5C;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAGA,yBAAqB;AAAA,EACtB;AACD;AAKA,SAAS,gBAAgBC,kBAAiB,YAAY;AACrD,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC3C,UAAM,QAAQA,iBAAgB,QAAQ,WAAW,CAAC,CAAC;AACnD,QAAI,UAAU,IAAI;AACjB,aAAO,WAAW,CAAC;AAAA,IACpB;AAAA,EACD;AACD;AAKA,SAAS,oBAAoBA,kBAAiB,YAAY;AACzD,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC3C,UAAM,QAAQA,iBAAgB,QAAQ,WAAW,CAAC,CAAC;AACnD,QAAI,UAAU,IAAI;AACjB,aAAO,KAAK,WAAW,CAAC,CAAC;AAAA,IAC1B;AAAA,EACD;AAEA,SAAO;AACR;AAKA,SAAS,aAAa,UAAU,MAAMC,UAAS,WAAW;AACzD,MAAI;AACJ,MAAI,SAAS,UAAU,IAAI,GAAG;AAC7B,aAAS,YAAY;AACrB,aACK,IAAI,SAAS,UAAU,IAAI,EAAE,SAAS,GAC1C,KAAK,MAAM,WAAW,SAAS,UAAU,IAAI,EAAE,CAAC,IAChD,KACC;AACD,UAAI,SAASA,QAAO,MAAM,OAAO;AAEhC,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAMA,SAAS,cAAcC,mBAAkB;AACxC,MAAI,UAAU;AAEd,SAAOA,kBAAiB,SAAS,GAAG;AAEnC,UAAMD,WAAUC,kBAAiB,IAAI;AAErC,eAAW,KAAKD,QAAO;AAGvB,QACCA,SAAQ,iBAAiB,QACzB,OAAOA,SAAQ,MAAM,cAAc,aAClC;AACD,UAAIA,SAAQ,MAAM,YAAY,eAAe;AAC5C;AAAA,MACD;AACA,sBAAgBA,SAAQ,MAAM;AAAA,IAC/B;AAEA,mBAAe,IAAI,IAAIA,SAAQ,YAAYA,SAAQ,UAAU;AAC7D,mBAAe,QAAQA,SAAQ,OAAOA,SAAQ,MAAM;AAGpD,QAAI,aAAa,SAASA,SAAQ,IAAI,GAAG;AACxC,MAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAC7C,MAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAC7C,mBAAa,KAAK,aAAaA,QAAO;AAAA,IACvC;AAGA,QAAI,aAAa,KAAK,MAAM,WAAW;AAAA,MACtC;AAAA,MACA,KAAK,MAAM;AAAA,IACZ;AAGA,iBAAa,WAAW,OAAO,CAAC,KAAK,QAAQ,CAAC;AAE9C,aACK,IAAI,WAAW,QAAQ,WAC3B,KAAM,YAAY,WAAW,CAAC,KAC7B;AACD,UAAI,cAAc,IAAI,SAAS,KAAK,UAAU,gBAAgB,MAAM;AACnE,cAAM,WAAW,cAAc,IAAI,SAAS;AAC5C,cAAM,SAAS,SAAS;AACxB,cAAM,WAAW,OAAO;AACxB,cAAM,SAAS,OAAO,UAAU;AAChC,YAAI,gBAAgB;AAEpB,YAAI,OAAO,eAAe,MAAM;AAC/B,UAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAC7C,UAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAAA,QAC9C,OAAO;AACN,UAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAC7C,UAAAA,SAAQ,QAAQA,SAAQ,aAAaA,SAAQ;AAAA,QAC9C;AAIA,YAAI,OAAO,aAAa,aAAa;AACpC,gBAAM,eAAe,SAAS,UAAU;AACxC,UAAAA,SAAQ,aAAaA,SAAQ,QAAQ,aAAa;AAClD,UAAAA,SAAQ,aAAaA,SAAQ,QAAQ,aAAa;AAAA,QACnD;AAEA,wBAAgB,OAAO,SAASA,SAAQ,OAAOA,SAAQ,KAAK;AAE5D,gBAAQA,SAAQ,MAAM;AAAA,UACrB,KAAK,aAAa,CAAC;AAAA,UACnB,KAAK,aAAa,CAAC;AAAA,UACnB,KAAK,aAAa,CAAC;AAAA,UACnB,KAAK,aAAa,CAAC;AAElB,gBAAI,SAAS,cAAcA,SAAQ,aAAa,CAAC,eAAe;AAC/D,kBACC;AAAA,gBACC;AAAA,gBACA,gBAAgB,iBAAiB,aAAa;AAAA,gBAC9CA;AAAA,gBACA;AAAA,cACD,GACC;AACD,0BAAU;AACV;AAAA,cACD;AAAA,YACD,WAES,SAAS,cAAc,QAAQ,eAAe;AACtD,kBACC;AAAA,gBACC;AAAA,gBACA,gBAAgB,iBAAiB,aAAa;AAAA,gBAC9CA;AAAA,gBACAA,SAAQ;AAAA,cACT,GACC;AACD,0BAAU;AACV;AAAA,cACD;AAAA,YACD;AAGA,gBACC,iBACA,aAAa,UAAUA,SAAQ,MAAMA,UAASA,SAAQ,SAAS,GAC9D;AACD,wBAAU;AACV;AAAA,YACD;AACA;AAAA,UAED,KAAK,WAAW,CAAC;AAAA,UACjB,KAAK,WAAW,CAAC;AAAA,UACjB,KAAK,WAAW,CAAC;AAAA,UACjB,KAAK,WAAW,CAAC;AAEhB,gBAAI,SAAS,cAAcA,SAAQ,aAAa,eAAe;AAE9D,kBAAI,aAAa,UAAUA,SAAQ,MAAMA,UAAS,IAAI,GAAG;AACxD,0BAAU;AACV;AAAA,cACD;AAAA,YACD;AACA;AAAA,UAED,KAAK,eAAe,CAAC;AAAA,UACrB,KAAK,eAAe,CAAC;AAAA,UACrB,KAAK,eAAe,CAAC;AAAA,UACrB,KAAK,eAAe,CAAC;AAEpB,gBAAI,SAAS,cAAcA,SAAQ,WAAW;AAE7C,kBAAI,aAAa,UAAUA,SAAQ,MAAMA,UAAS,IAAI,GAAG;AACxD,0BAAU;AACV;AAAA,cACD;AAAA,YACD;AACA;AAAA,UAED;AAEC,gBAAI,eAAe;AAElB,kBACC,aAAa,UAAUA,SAAQ,MAAMA,UAASA,SAAQ,SAAS,GAC9D;AACD,0BAAU;AACV;AAAA,cACD;AAAA,YACD;AACA;AAAA,QACF;AAAA,MACD;AACA,UAAI,YAAY,MAAM;AAErB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAMA,SAAS,eAAe,eAAe;AACtC,MAAI;AAGJ,MAAW,cAAc,cAAc,gBAAgB;AAEtD,aAAS,IAAI,GAAG,IAAI,cAAc,eAAe,QAAQ,IAAI,GAAG,KAAK;AACpE,YAAME,cAAa,cAAc,eAAe,CAAC;AACjD,iBAAW,WAAW,IAAI;AAC1B,eAAS;AAAA,QACR;AAAA,QACAA,YAAW;AAAA,QACXA,YAAW;AAAA,QACXA,YAAW;AAAA,QACXA,YAAW;AAAA,QACXA,YAAW;AAAA,MACZ;AACA,uBAAiB,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACD,OAAO;AAEN,eAAW,WAAW,IAAI;AAC1B,aAAS;AAAA,MACR;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IACf;AACA,qBAAiB,KAAK,QAAQ;AAAA,EAC/B;AAGA,MAAI,cAAc,cAAc,OAAO;AACtC,WAAO;AAAA,EACR;AAGA,mBAAiB,CAAC,EAAE,YAAY;AAChC,SAAO,OAAO,SAAS,iBAAiB,CAAC,CAAC;AAE1C,SAAO;AACR;AAMA,SAAS,YAAY,GAAG;AAEvB,gBAAc,eAAe,CAAC,CAAC;AAEhC;AAMA,SAAS,eAAe,GAAG;AAE1B,iBAAe,CAAC;AAGhB,QAAM,SAAS,iBAAiB,CAAC,EAAE;AAGnC,MAAI,cAAc,gBAAgB,KAAK,EAAE,SAAS,SAAS;AAE1D,QAAI,mBAAmB,MAAM;AAC5B,QAAE,eAAe;AAAA,IAClB;AAAA,EACD;AAEA,QAAM,UAAU,QAAQ,KAAK,MAAM;AAGnC,MAAI,SAAS;AACZ,oBAAgB,SAAS,aAAa,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;AAAA,EACnE;AACD;AAaO,IAAI,qBAAqB;AASzB,IAAM,UAAU,IAAI,gBAAQ,GAAG,GAAG,GAAG,CAAC;AAStC,IAAI,SAAS;AAWb,IAAI;AAOJ,SAAS,kBAAkB;AACjC,SAAO,iBAAiB,SAAS;AAClC;AAQO,SAAS,sBAAsB;AACrC,SAAO,cAAc,OAAO;AAC7B;AAiBO,SAAS,cAAc,GAAG,GAAG,GAAG;AACtC,MAAI,KAAK,aAAa,IAAI;AAC1B,QAAM,OAAc,iBAAiB,SAAS,UAAU,CAAC;AACzD,QAAM,aAAa,WAAW,oBAAoB;AAClD,OAAK,KAAK,QAAQ,WAAW,eAAe;AAC5C,OAAK,KAAK,OAAO,WAAW,eAAe;AAC3C,QAAMC,SAAQ,SAAS;AACvB,MAAIA,OAAM,MAAM,KAAOA,OAAM,MAAM,GAAK;AACvC,SAAKA,OAAM;AACX,SAAKA,OAAM;AAAA,EACZ;AACA,SAAO,EAAE,IAAI,IAAI,YAAY,IAAI,UAAU;AAC5C;AAUO,SAAS,eAAe,SAAS,OAAO;AAC9C,UAAQ,MAAM,cAAc,IAAI,SAAS;AAC1C;AAkBO,SAAS,cAAc;AAC7B,QAAM,SAAS,UAAU,SAAS,IAAI,QAAQ,OAAO,UAAU,CAAC;AAChE,QAAM,UAAU,UAAU,SAAS,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC;AAGjE,qBAAmB;AAGnB,MAAI,CAAC,cAAc,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,EAC3D;AAEA,UAAQ,KAAK,MAAM,IAAI;AACxB;AASO,SAAS,cAAc,QAAQ;AAErC,UAAQ,KAAK,OAAO,WAAW,cAAc,QAAQ,OAAO,MAAM,IAAI;AACvE;AAsCO,SAAS,qBAAqB,WAAW,QAAQ,UAAU;AAEjE,qBAAmB;AAEnB,MAAI,iBAAiB,QAAQ,SAAS,MAAM,IAAI;AAC/C,UAAM,IAAI,MAAM,0BAA0B,SAAS;AAAA,EACpD;AAEA,MAAI,OAAO,WAAW,aAAa;AAClC,UAAM,IAAI;AAAA,MACT,sCACC,SAAS,MAAM,IACf;AAAA,IACF;AAAA,EACD;AAEA,QAAM,aAAa;AAAA,IAClB;AAAA,IACA,gBAAgB,SAAS;AAAA,EAC1B;AAGA,MAAI,CAAC,cAAc,IAAI,MAAM,GAAG;AAC/B,kBAAc,IAAI,QAAQ;AAAA,MACzB;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,WAAW;AAAA,IACZ,CAAC;AAAA,EACF;AAGA,QAAM,WAAW,cAAc,IAAI,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC3C,UAAMC,aAAY,WAAW,CAAC;AAC9B,QAAI,SAAS,UAAUA,UAAS,GAAG;AAClC,eAAS,UAAUA,UAAS,EAAE,KAAK,QAAQ;AAAA,IAC5C,OAAO;AACN,eAAS,UAAUA,UAAS,IAAI,CAAC,QAAQ;AAAA,IAC1C;AAAA,EACD;AACD;AAaO,SAAS,oBAAoB,WAAW,QAAQ,UAAU;AAChE,MAAI,iBAAiB,QAAQ,SAAS,MAAM,IAAI;AAC/C,UAAM,IAAI,MAAM,0BAA0B,SAAS;AAAA,EACpD;AAGA,QAAM,aAAa;AAAA,IAClB;AAAA,IACA,gBAAgB,SAAS;AAAA,EAC1B;AAEA,QAAM,WAAW,cAAc,IAAI,MAAM;AACzC,MAAI,OAAO,aAAa,aAAa;AACpC,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC3C,YAAMA,aAAY,WAAW,CAAC;AAC9B,UAAI,SAAS,UAAUA,UAAS,GAAG;AAClC,YAAI,OAAO,aAAa,aAAa;AACpC,iBAAO,SAAS,UAAUA,UAAS,GAAG,QAAQ;AAAA,QAC/C,OAAO;AACN,iBAAO,SAAS,UAAUA,UAAS,EAAE,SAAS,GAAG;AAChD,qBAAS,UAAUA,UAAS,EAAE,IAAI;AAAA,UACnC;AAAA,QACD;AAEA,YAAI,SAAS,UAAUA,UAAS,EAAE,WAAW,GAAG;AAC/C,iBAAO,SAAS,UAAUA,UAAS;AAAA,QACpC;AAAA,MACD;AAAA,IACD;AACA,QAAI,OAAO,KAAK,SAAS,SAAS,EAAE,WAAW,GAAG;AACjD,oBAAc,OAAO,MAAM;AAAA,IAC5B;AAAA,EACD;AACD;AAUO,SAAS,wBAAwB,QAAQ;AAC/C,MAAI,cAAc,IAAI,MAAM,GAAG;AAC9B,aAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;AACjD,0BAAoB,iBAAiB,CAAC,GAAG,MAAM;AAAA,IAChD;AAAA,EACD;AACD;AAeO,SAAS,qBAAqB;AACpC,MAAW,uBAAuB;AACjC,UAAM,UAAU,KAAK,iBAAiB;AACtC,YAAQ,mBAAmB;AAC3B,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAOO,SAAS,kBAAkB;AACjC,MAAW,uBAAuB;AACjC,eAAW,SAAS,gBAAgB;AACpC,WAAO;AAAA,EACR;AACA,SAAO;AACR;;;AClzBA,IAAM,iBAAN,MAAqB;AAAA,EACpB,cAAc;AACb,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,WAAW,IAAI,SAAS;AAC7B,SAAK,WAAW,IAAI,SAAS;AAC7B,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,UAAU,OAAO;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ;AACP,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU,OAAO;AACtB,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AACD;AAEA,IAAO,mBAAQ;;;AC1Bf,IAAM,qBAAqB;AAM3B,IAAM,uBAAuB;AAM7B,IAAM,sBAAsB;AAO5B,IAAM,YAAY,CAAC;AACnB,SAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC5B,YAAU,KAAK,IAAI,SAAS,CAAC;AAC9B;AAOA,IAAM,WAAW,CAAC;AAClB,SAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,WAAS,KAAK,CAAC,CAAC;AACjB;AAaA,SAAS,gBAAgB,QAAQ,QAAQ,QAAQ;AAChD,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,CAAC,OAAO;AAClB,QAAM,MAAM,OAAO;AACnB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAE7B,UAAM,MAAM,OAAO,CAAC,EAAE,IAAI,MAAM;AAChC,QAAI,MAAM,KAAK;AACd,YAAM;AAAA,IACP;AACA,QAAI,MAAM,KAAK;AACd,YAAM;AAAA,IACP;AAAA,EACD;AACA,SAAO,CAAC,IAAI;AACZ,SAAO,CAAC,IAAI;AACb;AAkBA,SAAS,iBAAiB,MAAM,MAAM,SAAS,SAAS,MAAM,UAAU;AACvE,QAAM,SAAS,SAAS,IAAI;AAC5B,QAAM,SAAS,SAAS,IAAI;AAE5B,QAAM,UAAU,UAAU,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,IAAI;AACnD,QAAM,kBAAkB,QAAQ,IAAI,IAAI;AAGxC,kBAAgB,SAAS,MAAM,MAAM;AACrC,kBAAgB,SAAS,MAAM,MAAM;AAErC,SAAO,CAAC,KAAK;AACb,SAAO,CAAC,KAAK;AAEb,MAAI,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG;AACnD,cAAU,KAAK,OAAO;AACtB,aAAS,KAAK,MAAM;AACpB,aAAS,KAAK,MAAM;AACpB,WAAO;AAAA,EACR;AAGA,MAAI,UAAU;AACb,QAAI,UAAU;AAEd,QAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG;AAC1B,eAAS,OAAO;AAEhB,UAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG;AAC1B,kBAAU,OAAO,CAAC,IAAI,OAAO,CAAC;AAC9B,iBAAS,OAAO;AAAA,MAEjB,OAAO;AACN,cAAM,UAAU,OAAO,CAAC,IAAI,OAAO,CAAC;AACpC,cAAM,UAAU,OAAO,CAAC,IAAI,OAAO,CAAC;AACpC,kBAAU,UAAU,UAAU,UAAU,CAAC;AAAA,MAC1C;AAAA,IAED,OAAO;AACN,eAAS,OAAO;AAEhB,UAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG;AAC1B,kBAAU,OAAO,CAAC,IAAI,OAAO,CAAC;AAC9B,iBAAS,OAAO;AAAA,MAEjB,OAAO;AACN,cAAM,WAAW,OAAO,CAAC,IAAI,OAAO,CAAC;AACrC,cAAM,WAAW,OAAO,CAAC,IAAI,OAAO,CAAC;AACrC,kBAAU,WAAW,WAAW,WAAW,CAAC;AAAA,MAC7C;AAAA,IACD;AAGA,UAAM,aAAa,KAAK,IAAI,OAAO;AACnC,QAAI,aAAa,SAAS,SAAS;AAClC,eAAS,UAAU;AACnB,eAAS,SAAS,KAAK,IAAI;AAC3B,UAAI,UAAU,GAAG;AAChB,iBAAS,SAAS,WAAW;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AACA,YAAU,KAAK,OAAO;AACtB,WAAS,KAAK,MAAM;AACpB,WAAS,KAAK,MAAM;AACpB,SAAO;AACR;AAkBA,SAAS,aAAa,MAAM,OAAO;AAClC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,MAAI,KAAK,GAAG;AAGX,WAAO;AAAA,EACR,WAAW,KAAK,MAAM;AAGrB,WAAO;AAAA,EACR,OAAO;AAEN,WAAO;AAAA,EACR;AACD;AAYO,SAAS,mBAAmB,GAAG,OAAO,GAAG,OAAO,UAAU;AAEhE,QAAM,UAAU,MAAM;AACtB,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,SAAS;AACtB,QAAM,UAAU,MAAM;AACtB,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,SAAS;AAEtB,QAAM,OAAO,UAAU,IAAI,EACzB,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,MAAM,GAAG;AACf,QAAM,OAAO,UAAU,IAAI,EACzB,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,MAAM,GAAG;AAGf,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC9B,QAAI,iBAAiB,MAAM,MAAM,SAAS,SAAS,SAAS,CAAC,GAAG,QAAQ,GAAG;AAC1E,gBAAU,KAAK,IAAI;AACnB,gBAAU,KAAK,IAAI;AACnB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC9B,QAAI,iBAAiB,MAAM,MAAM,SAAS,SAAS,SAAS,CAAC,GAAG,QAAQ,GAAG;AAC1E,gBAAU,KAAK,IAAI;AACnB,gBAAU,KAAK,IAAI;AACnB,aAAO;AAAA,IACR;AAAA,EACD;AAKA,MAAI,UAAU;AACb,aAAS,IAAI;AACb,aAAS,IAAI;AACb,aAAS,SAAS,KAAK,SAAS,QAAQ,EAAE,MAAM,SAAS,OAAO;AAAA,EACjE;AACA,YAAU,KAAK,IAAI;AACnB,YAAU,KAAK,IAAI;AACnB,SAAO;AACR;AAaO,SAAS,mBAAmB,GAAG,UAAU,GAAG,UAAU,UAAU;AAGtE,QAAM,cAAc,UAAU,IAAI,EAChC,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,SAAS,GAAG,EAChB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,SAAS,GAAG;AAClB,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,UAAU;AAC9B,QAAM,gBAAgB,cAAc;AACpC,QAAM,aAAa,YAAY,QAAQ;AAEvC,MAAI,aAAa,eAAe;AAC/B,cAAU,KAAK,WAAW;AAC1B,WAAO;AAAA,EACR;AAEA,MAAI,UAAU;AACb,UAAM,OAAO,KAAK,KAAK,UAAU;AACjC,aAAS,IAAI;AACb,aAAS,IAAI;AACb,aAAS,UAAU,cAAc;AACjC,aAAS,SAAS,KAAK,YAAY,UAAU,CAAC;AAC9C,aAAS,SAAS,KAAK,WAAW,EAAE,MAAM,SAAS,OAAO;AAC1D,aAAS,OAAO,WAAW,WAAW,QAAQ,UAAU;AACxD,aAAS,OAAO,WAAW,WAAW,QAAQ,UAAU;AAAA,EACzD;AACA,YAAU,KAAK,WAAW;AAC1B,SAAO;AACR;AAYO,SAAS,mBAAmB,GAAG,OAAO,GAAG,UAAU,UAAU;AAEnE,QAAM,YAAY,UAAU,IAAI,EAC9B,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,SAAS,GAAG,EAChB,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,SAAS,oBAAoB,CAAC,EACpC,IAAI,MAAM,GAAG;AACf,QAAM,SAAS,SAAS;AACxB,QAAM,UAAU,SAAS;AACzB,QAAM,SAAS,MAAM;AACrB,QAAM,QAAQ,MAAM;AACpB,QAAM,MAAM,MAAM;AAClB,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,QAAQ,UAAU,IAAI;AAC5B,MAAI,OAAO;AAGX,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,UAAM,OAAO,MAAM,MAAM,IAAI,IAAI,IAAI;AACrC,UAAM,OAAO,MAAM,IAAI,MAAM,IAAI,IAAI;AACrC,QAAI,UAAU;AACd,QAAI,WAAW;AAGf,SAAK,KAAK,MAAM,CAAC,CAAC;AAElB,UAAM,KAAK,SAAS,EAAE,IAAI,OAAO,CAAC,CAAC;AAKnC,QAAI,YAAY,MAAM,QAAQ,IAAI,SAAS;AAC1C,eAAS,OAAO;AAAA,IACjB;AAGA,QAAI,SAAS,aAAa,MAAM,KAAK;AACrC,QAAI,WAAW;AAEf,QAAI,WAAW,oBAAoB;AAClC,UAAI,SAAS;AACb,UAAI,MAAM,GAAG;AAEZ,aAAK,KAAK,MAAM,IAAI,CAAC;AAErB,iBAAS,UAAU,IAAI,EAAE,KAAK,SAAS,EAAE,IAAI,OAAO,IAAI,CAAC;AACzD,iBAAS,aAAa,MAAM,MAAM;AAClC,YAAI,WAAW,qBAAqB;AACnC,qBAAW;AAAA,QACZ;AAAA,MACD;AAEA,UAAI,UAAU;AAEb,eAAO,MAAM,OAAO;AACpB,YAAI,OAAO,QAAQ;AAElB,oBAAU,KAAK,SAAS;AACxB,oBAAU,KAAK,IAAI;AACnB,oBAAU,KAAK,MAAM;AACrB,oBAAU,KAAK,KAAK;AACpB,cAAI,QAAQ;AACX,sBAAU,KAAK,MAAM;AAAA,UACtB;AACA,iBAAO;AAAA,QACR,WAAW,UAAU;AAEpB,mBAAS,OAAO;AAChB,qBAAW,MAAM,UAAU;AAC3B,oBAAU,SAAS;AAAA,QACpB;AAAA,MACD;AAEA,UAAI,QAAQ;AACX,kBAAU,KAAK,MAAM;AAAA,MACtB;AAAA,IAED,WAAW,WAAW,qBAAqB;AAC1C,UAAI,MAAM,GAAG;AAEZ,aAAK,KAAK,MAAM,IAAI,CAAC;AAErB,cAAM,KAAK,SAAS,EAAE,IAAI,OAAO,IAAI,CAAC;AACtC,iBAAS,aAAa,MAAM,KAAK;AACjC,YAAI,WAAW,oBAAoB;AAClC,qBAAW;AAAA,QACZ;AAAA,MACD;AAEA,UAAI,UAAU;AAEb,eAAO,MAAM,OAAO;AACpB,YAAI,OAAO,QAAQ;AAElB,oBAAU,KAAK,SAAS;AACxB,oBAAU,KAAK,IAAI;AACnB,oBAAU,KAAK,MAAM;AACrB,oBAAU,KAAK,KAAK;AACpB,iBAAO;AAAA,QACR,WAAW,UAAU;AAEpB,mBAAS,OAAO;AAChB,qBAAW,MAAM,UAAU;AAC3B,oBAAU,SAAS;AAAA,QACpB;AAAA,MACD;AAAA,IAED,OAAO;AAGN,aAAO,KAAK,MAAM,QAAQ,CAAC,CAAC;AAG5B,aAAO,MAAM,IAAI,MAAM;AACvB,YAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,WAAK,QAAQ,KAAK,OAAO,MAAM,UAAU,QAAQ;AAEhD,kBAAU,KAAK,SAAS;AACxB,kBAAU,KAAK,IAAI;AACnB,kBAAU,KAAK,MAAM;AACrB,kBAAU,KAAK,KAAK;AACpB,eAAO;AAAA,MACR,WAAW,UAAU;AAEpB,mBAAW;AACX,kBAAU,SAAS;AAGnB,YAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ;AACtC,mBAAS,OAAO;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AAIA,QACC,YACA,YACA,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,OAAO,GAC5C;AACD,eAAS,UAAU;AACnB,eAAS,SAAS,KAAK,QAAQ;AAAA,IAChC;AAAA,EACD;AAGA,MAAI,UAAU;AACb,aAAS,IAAI;AACb,aAAS,IAAI;AACb,aAAS,SAAS,KAAK,SAAS,QAAQ,EAAE,MAAM,SAAS,OAAO;AAAA,EACjE;AACA,YAAU,KAAK,SAAS;AACxB,YAAU,KAAK,IAAI;AACnB,YAAU,KAAK,MAAM;AACrB,YAAU,KAAK,KAAK;AACpB,SAAO;AACR;AAeO,SAAS,mBAAmB,GAAG,UAAU,GAAG,OAAO,UAAU;AAEnE,QAAM,SAAS,mBAAmB,GAAG,OAAO,GAAG,UAAU,QAAQ;AACjE,MAAI,UAAU,UAAU;AAEvB,UAAM,OAAO,SAAS;AACtB,UAAM,OAAO,SAAS;AACtB,aAAS,SAAS,WAAW;AAC7B,aAAS,SAAS,WAAW;AAC7B,aAAS,IAAI,SAAS;AACtB,aAAS,IAAI;AACb,aAAS,OAAO,SAAS;AACzB,aAAS,OAAO;AAAA,EACjB;AACA,SAAO;AACR;;;AChfA,IAAM,aAAa;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AACjB;AAYA,IAAM,WAAW;AAAA,EAChB,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,EACtB,UAAU;AAAA,IACT,SAAS,IAAI,SAAS,GAAG,CAAC;AAAA,IAC1B,qBAAqB,WAAY;AAChC,aAAO,KAAK;AAAA,IACb;AAAA,EACD;AACD;AAGA,IAAM,UAAU,IAAI,OAAO;AAC3B,IAAM,UAAU,IAAI,OAAO;AAK3B,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAId,YAAY,OAAO;AAElB,SAAK,QAAQ;AAOb,SAAK,WAAW,IAAI,iBAAe;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAc,GAAG,GAAG;AACnB,UAAM,QAAQ,EAAE;AAChB,UAAM,QAAQ,EAAE;AAChB,WACC,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,MAAM,KACN,EAAE,gBAAgB,QAClB,EAAE,gBAAgB,QAClB,MAAM,OAAO,SAAS,KACtB,MAAM,OAAO,SAAS,KACtB,EAAE,MAAM,aAAa,QAAQ,MAAM,aAAa,UAC/C,MAAM,gBAAgB,MAAM,mBAAmB,MAC/C,MAAM,gBAAgB,MAAM,mBAAmB;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,OAAO,OAAO,WAAW,KAAK,UAAU;AAEhD,aACK,SAAS,MAAM,OAAO,QAAQ,QAClC,UAAW,SAAS,MAAM,OAAO,MAAM,KACtC;AAED,eACK,SAAS,MAAM,OAAO,QAAQ,QAClC,UAAW,SAAS,MAAM,OAAO,MAAM,KACtC;AAED,YACC,WAAW,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,UACrC;AAAA,UACA,MAAM;AAAA;AAAA,UACN;AAAA,UACA,MAAM;AAAA;AAAA,UACN;AAAA;AAAA,UAEA,SAAS,MAAM;AAAA,QAChB,MAAM,MACL;AAED,mBAAS,cAAc;AACvB,mBAAS,cAAc;AAEvB,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAM;AAChB,QAAI,mBAAmB;AAEvB,UAAM,aAAa,KAAK,MAAM,WAAW,SAAS,IAAI;AAEtD,YAAQ,UAAU,KAAK,UAAU,GAAG,IAAI;AACxC,YAAQ,UAAU,KAAK,KAAK,UAAU,CAAC;AAEvC,aAAS,IAAI,GAAG,MAAM,WAAW,QAAQ,IAAI,KAAK,KAAK;AACtD,YAAM,OAAO,WAAW,CAAC;AAEzB,UAAI,KAAK,cAAc,MAAM,IAAI,GAAG;AACnC,gBAAQ,UAAU,KAAK,UAAU,GAAG,IAAI;AACxC,gBAAQ,UAAU,KAAK,KAAK,UAAU,CAAC;AAGvC,YAAI,QAAQ,SAAS,OAAO,GAAG;AAC9B,cAAI,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,GAAG;AAExC;AAGA,gBACC,KAAK,eACL,KAAK,YAAY,KAAK,UAAU,IAAI,MAAM,SAC1C,KAAK,KAAK,aAAa,OACtB;AACD,mBAAK,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK,QAAQ;AAAA,YAC3D;AACA,gBACC,KAAK,eACL,KAAK,YAAY,KAAK,UAAU,IAAI,MAAM,SAC1C,KAAK,KAAK,aAAa,OACtB;AACD,mBAAK,KAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK,QAAQ;AAAA,YAC3D;AAIA,gBAAI,KAAK,KAAK,OAAO,SAAS,KAAK,KAAK,KAAK,OAAO,SAAS,GAAG;AAC/D,kBAAI,cAAc;AAClB,qBAAO,gBAAgB,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,GAAG;AAChE,sBAAM,UAAU,KAAK,SAAS;AAC9B,sBAAM,WAAW,KAAK,SAAS;AAG/B,oBAAI,KAAK,KAAK,aAAa,OAAO;AACjC,uBAAK,KAAK,SAAS,IAAI,IAAI,OAAO;AAElC,wBAAM,UACL,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS;AAC3D,sBAAI,UAAU,GAAG;AAChB,yBAAK,KAAK,IAAI,KAAK,UAAU,SAAS;AACtC,yBAAK,KAAK,IAAI,KAAK,UAAU,SAAS;AAAA,kBACvC;AAAA,gBACD;AACA,oBAAI,KAAK,KAAK,aAAa,OAAO;AACjC,uBAAK,KAAK,SAAS,IAAI,IAAI,OAAO;AAClC,wBAAM,UACL,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS;AAC3D,sBAAI,UAAU,GAAG;AAChB,yBAAK,KAAK,IAAI,KAAK,UAAU,SAAS;AACtC,yBAAK,KAAK,IAAI,KAAK,UAAU,SAAS;AAAA,kBACvC;AAAA,gBACD;AAEA,wBAAQ,UAAU,KAAK,UAAU,GAAG,IAAI;AACxC,wBAAQ,UAAU,KAAK,KAAK,UAAU,CAAC;AAAA,cACxC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,QAAQ,MAAM,SAAS,CAAC,GAAG;AAC1B,QAAI,mBAAmB;AAGvB,UAAM,aAAa,KAAK,MAAM,WAAW,SAAS,IAAI;AAEtD,aAAS,IAAI,WAAW,QAAQ,MAAM,KAAM,OAAO,WAAW,CAAC,KAAM;AAEpE,UAAI,KAAK,QAAQ,KAAK,UAAU,EAAE,SAAS,KAAK,UAAU,CAAC,GAAG;AAE7D,cAAM,OAAO,KAAK,KAAK,OAAO;AAC9B,YAAI,KAAK,KAAK,OAAO,WAAW,GAAG;AAClC;AAAA,QACD;AAEA,cAAM,SAAS;AAGf,YAAI,SAAS;AACb,WAAG;AACF,gBAAM,SAAS,KAAK,KAAK,SAAS,MAAM;AAGxC,cACC,WAAW,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,YACrC;AAAA,YACA;AAAA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YACA;AAAA,UACD,GACC;AAED,mBAAO,gBAAgB,IAAI;AAC3B;AAAA,UACD;AACA;AAAA,QACD,SAAS,SAAS;AAAA,MACnB;AAAA,IACD;AAGA,WAAO,SAAS;AAGhB,WAAO;AAAA,EACR;AACD;AACA,IAAO,mBAAQ;;;ACtQf,IAAM,WAAW,CAAC;AAOlB,SAAS,aACR,OACA,QACA,cAAc,GACd,aAAa,GACbC,SAAQ,GACP;AACD,MAAI,SAAS,SAAS,GAAG;AACxB,UAAM,MAAM,SAAS,IAAI;AACzB,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,QAAI,cAAc;AAClB,QAAI,aAAa;AACjB,QAAI,QAAQA;AACZ,WAAO;AAAA,EACR,OAAO;AACN,WAAO,IAAI,SAAS,OAAO,QAAQ,aAAa,YAAYA,MAAK;AAAA,EAClE;AACD;AAMA,SAAS,cAAc,IAAI;AAC1B,WAAS,KAAK,EAAE;AACjB;AAMA,IAAM,YAAY,IAAI,SAAS;AAM/B,IAAqB,WAArB,MAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7B,YAAY,OAAO,QAAQ,cAAc,GAAG,aAAa,GAAGA,SAAQ,GAAG;AACtE,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,SAAK,cAAc;AACnB,SAAK,aAAa;AAElB,SAAK,QAAQA;AAEb,SAAK,UAAU,CAAC;AAChB,SAAK,QAAQ,CAAC;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,WAAW,KAAK,OAAO,QAAQ;AACrC,UAAM,YAAY,KAAK,OAAO,SAAS;AACvC,UAAM,OAAO,KAAK,OAAO;AACzB,UAAM,MAAM,KAAK,OAAO;AAGxB,SAAK,MAAM,CAAC,IAAI;AAAA,MACf,KAAK;AAAA,MACL;AAAA,QACC,MAAM,OAAO;AAAA,QACb;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACD;AAGA,SAAK,MAAM,CAAC,IAAI;AAAA,MACf,KAAK;AAAA,MACL;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACD;AAGA,SAAK,MAAM,CAAC,IAAI;AAAA,MACf,KAAK;AAAA,MACL;AAAA,QACC;AAAA,QACA,KAAK,MAAM;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACD;AAGA,SAAK,MAAM,CAAC,IAAI;AAAA,MACf,KAAK;AAAA,MACL;AAAA,QACC,MAAM,OAAO;AAAA,QACb,KAAK,MAAM;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAM;AACd,QAAI;AACJ,UAAM,SAAS,KAAK,UAAU;AAG9B,QAAI,KAAK,eAAe,MAAM;AAC7B,YAAM,KAAK,MAAM,IAAI,SAAS;AAAA,QAC7B,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,MACD;AAAA,IACD,OAAO;AACN,YAAM,UAAU,IAAI,KAAK,MAAM,KAAK,GAAG;AAAA,IACxC;AAEA,QAAI,QAAQ;AACZ,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAClB,UAAM,mBAAmB,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ;AAChE,UAAM,qBAAqB,KAAK,OAAO,MAAM,KAAK,OAAO,SAAS;AAElE,UAAM,cAAc,KAAK,sBAAsB,KAAK,KAAK;AAEzD,UAAM,iBAAiB,KAAK;AAG5B,QAAI,KAAK,oBAAoB,KAAK,KAAK,kBAAkB;AACxD,UAAI,aAAa;AAChB,gBAAQ;AAAA,MACT,WAAW,gBAAgB;AAC1B,gBAAQ;AAAA,MACT;AAAA,IACD,WAAW,KAAK,kBAAkB;AAEjC,UAAI,aAAa;AAChB,gBAAQ;AAAA,MACT,WAAW,gBAAgB;AAC1B,gBAAQ;AAAA,MACT;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,WAAW;AAC1B,UAAM,WAAW,UAAU;AAC3B,UAAM,iBAAiB,SAAS;AAChC,aAAS,IAAI,gBAAgB,OAAO,KAAM,QAAQ,SAAS,CAAC,KAAM;AACjE,UAAI,MAAM,gBAAgB,MAAM;AAC/B,YAAI,OAAO,MAAM,aAAa,YAAY;AACzC,cAAI,MAAM,SAAS,iBAAiB;AACnC,iBAAK,OAAO,KAAK;AAAA,UAClB;AAEA,eAAK,gBAAgB,KAAK;AAAA,QAC3B,OAAO;AAGN,cAAI,OAAO,MAAM,cAAc,YAAY;AAC1C,iBAAK,OAAO,KAAK;AAAA,UAClB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM;AACZ,QAAI,QAAQ;AAGZ,QAAI,KAAK,MAAM,SAAS,GAAG;AAC1B,cAAQ,KAAK,SAAS,IAAI;AAE1B,UAAI,UAAU,IAAI;AACjB,aAAK,MAAM,KAAK,EAAE,OAAO,IAAI;AAC7B;AAAA,MACD;AAAA,IACD;AAEA,SAAK,QAAQ,KAAK,IAAI;AAEtB,QACC,KAAK,QAAQ,SAAS,KAAK,eAC3B,KAAK,QAAQ,KAAK,YACjB;AAED,UAAI,KAAK,MAAM,WAAW,GAAG;AAC5B,aAAK,MAAM;AAAA,MACZ;AAGA,YAAM,YAAY,CAAC;AACnB,eAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,QAAQ,IAAI,KAAK,KAAK;AACxD,gBAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC;AACrC,YAAI,UAAU,IAAI;AACjB,eAAK,MAAM,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,QACzC,OAAO;AACN,oBAAU,KAAK,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC/B;AAAA,MACD;AACA,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,MAAM,IAAI,QAAQ;AAE1B,UAAM,SAAS,OAAO,WAAW;AACjC,QAAI,QAAQ;AACX,eAAS,CAAC;AAAA,IACX;AAGA,UAAM,UAAU,KAAK;AACrB,aAAS,IAAI,GAAG,MAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK;AACnD,aAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,IACvB;AAGA,QAAI,KAAK,MAAM,SAAS,GAAG;AAC1B,YAAM,QAAQ,KAAK,SAAS,IAAI;AAGhC,UAAI,UAAU,IAAI;AACjB,aAAK,MAAM,KAAK,EAAE,SAAS,MAAM,QAAW,MAAM;AAAA,MACnD,OAAO;AAEN,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC3C,eAAK,MAAM,CAAC,EAAE,SAAS,MAAM,QAAW,MAAM;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAEA,QAAI,UAAU,OAAO,OAAO,YAAY;AACvC,aAAO,KAAK,EAAE;AAAA,IACf;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM;AACZ,QAAI,QAAQ;AAEZ,QAAI,OAAO,KAAK,cAAc,aAAa;AAE1C,aAAO;AAAA,IACR;AAGA,QAAI,KAAK,MAAM,SAAS,GAAG;AAE1B,YAAM,QAAQ,KAAK,SAAS,IAAI;AAEhC,UAAI,UAAU,IAAI;AACjB,gBAAQ,OAAO,KAAK,MAAM,KAAK,GAAG,IAAI;AAEtC,YAAI,SAAS,KAAK,MAAM,KAAK,EAAE,WAAW,GAAG;AAC5C,eAAK,MAAM,OAAO,OAAO,CAAC;AAAA,QAC3B;AAAA,MACD;AAAA,IACD;AAEA,QAAI,UAAU,OAAO;AAEpB,UAAI,KAAK,QAAQ,QAAQ,IAAI,MAAM,IAAI;AACtC,eAAO,KAAK,SAAS,IAAI;AACzB,gBAAQ;AAAA,MACT;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,EAAE,KAAK,YAAY,KAAK,KAAK,QAAQ,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,IAAI,IAAI,GAAG;AACjD,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACrD,eAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ;AACb,SAAK,QAAQ,SAAS;AAEtB,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC3C,WAAK,MAAM,CAAC,EAAE,MAAM;AAEpB,oBAAc,KAAK,MAAM,CAAC,CAAC;AAAA,IAC5B;AAEA,SAAK,MAAM,SAAS;AAGpB,QAAI,OAAO,WAAW,aAAa;AAClC,WAAK,OAAO;AAAA,QACX,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,MACZ;AAAA,IACD;AAAA,EACD;AACD;;;AC1XA,IAAqB,QAArB,cAAmC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,YAAY,IAAI,GAAG,IAAI,GAAG,QAAQ,UAAU,SAAS,UAAU;AAE9D,UAAM,GAAG,GAAG,OAAO,QAAQ,IAAI;AAG/B,SAAK,OAAO;AAGZ,SAAK,YAAY,IAAI,GAAG,CAAC;AAMzB,SAAK,MAAM;AAWX,SAAK,SAAS;AAQd,SAAK,MAAM;AAOX,SAAK,UAAU,IAAI,SAAS,GAAG,IAAI;AAUnC,SAAK,YAAY;AAMjB,SAAK,SAAS,oBAAI,IAAI;AAMtB,SAAK,aAAa,IAAI;AAAA,MACrB;AAAA,MACA,KAAK,UAAU,EAAE,MAAM;AAAA,MACvB,UAAU;AAAA,MACV,UAAU;AAAA,IACX;AAMA,SAAK,WAAW,IAAI,iBAAS,IAAI;AAGjC,iBAAa,YAAY,YAAY,KAAK,MAAM,KAAK,IAAI,CAAC;AAG1D,iBAAa,YAAY,cAAc,MAAM;AAE5C,WAAK,WAAW,MAAM,KAAK,UAAU,CAAC;AAAA,IACvC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AAEP,SAAK,WAAW,MAAM;AAGtB,SAAK,YAAY,IAAI,GAAG,CAAC;AAGzB,UAAM,MAAM;AAGZ,UAAM,mBAAmB,CAAC;AAC1B,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC9B,UAAI,MAAM,YAAY,MAAM,SAAS,cAAc;AAClD,yBAAiB,KAAK,KAAK;AAAA,MAC5B;AAAA,IACD,CAAC;AAID,SAAK,OAAO,MAAM;AAGlB,QAAI,iBAAiB,SAAS,GAAG;AAChC,uBAAiB,QAAQ,CAAC,SAAS;AAClC,aAAK,QAAQ,IAAI;AAAA,MAClB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,MAAM;AAEb,QAAI,KAAK,WAAW,WAAW;AAC9B,WAAK,OAAO,IAAI,IAAI;AAAA,IACrB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAM;AAEhB,QAAI,KAAK,WAAW,WAAW;AAC9B,WAAK,OAAO,OAAO,IAAI;AAAA,IACxB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,MAAM;AAEtB,QAAI,CAAC,KAAK,iBAAiB,KAAK,iBAAiB,GAAG;AACnD,YAAM,UAAU,KAAK;AAGrB,WAAK,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,KAAK;AAC7C,WAAK,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,KAAK;AAAA,IAC9C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,IAAI;AAEV,QAAI,KAAK,WAAW,aAAa,oBAAoB,MAAM,MAAM;AAEhE,WAAK,WAAW,MAAM;AAEtB,WAAK,WAAW,gBAAgB,IAAI;AAAA,IACrC;AAGA,SAAK,KAAK,EAAE;AAGZ,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,IAAI;AACR,QAAI,KAAK,WAAW,WAAW;AAC9B,YAAM,WAAW,cAAM,SAAS;AAEhC,iBAAW,QAAQ,KAAK,QAAQ;AAC/B,YAAI,CAAC,KAAK,UAAU;AACnB,gBAAM,WAAW,KAAK;AACtB,cAAI,CAAC,UAAU;AACd;AAAA,UACD;AAEA,cACC,EAAE,YAAY,CAAC,SAAS,sBACvB,SAAS,cAAc,SAAS,eAChC;AAED,iBAAK,iBAAiB,IAAI;AAE1B,gBAAI,KAAK,OAAO,EAAE,MAAM,MAAM;AAE7B,uBAAS,UAAU;AAAA,YACpB;AAEA,iBAAK,SAAS,WAAW,QAAQ;AAEjC,iBAAK,MAAM,IAAI,GAAG,CAAC;AAAA,UACpB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,iBAAa,KAAK,YAAY,EAAE;AAAA,EACjC;AACD;;;ACxPA;;;ACAA,IAAAC,qBAAA;;;ACKA,IAAqB,oBAArB,MAAuC;AAAA,EACtC,YAAY,aAAa,gBAAgB;AAExC,SAAK,aAAa;AAElB,SAAK,UAAU;AAEf,SAAK,YAAY;AAEjB,SAAK,cAAc;AAGnB,SAAK,SAAS,IAAI;AAAA,MACjB,KAAK,YAAY,KAAK,aAAa,KAAK;AAAA,IACzC;AAEA,SAAK,YAAY,IAAI,aAAa,KAAK,MAAM;AAC7C,SAAK,YAAY,IAAI,YAAY,KAAK,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS,KAAK,SAAS;AAC7B,WAAO,KAAK,cAAc,UAAU,KAAK;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aAAa;AACnB,WAAO,cAAc,KAAK,WAAW;AAEpC,WAAK,cAAc;AAAA,IACpB;AAGA,UAAMC,QAAO,KAAK;AAGlB,SAAK,SAAS,IAAI;AAAA,MACjB,KAAK,YAAY,KAAK,aAAa,KAAK;AAAA,IACzC;AACA,SAAK,YAAY,IAAI,aAAa,KAAK,MAAM;AAC7C,SAAK,YAAY,IAAI,YAAY,KAAK,MAAM;AAG5C,SAAK,UAAU,IAAIA,KAAI;AAEvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,GAAG,GAAG,GAAG,GAAG,MAAM;AACtB,QAAI,SAAS,KAAK,cAAc,KAAK;AAErC,QAAI,KAAK,eAAe,KAAK,WAAW;AACvC,WAAK,OAAO,KAAK,WAAW;AAAA,IAC7B;AAEA,SAAK,UAAU,MAAM,IAAI;AACzB,SAAK,UAAU,EAAE,MAAM,IAAI;AAE3B,QAAI,OAAO,MAAM,aAAa;AAC7B,WAAK,UAAU,EAAE,MAAM,IAAI;AAC3B,WAAK,UAAU,EAAE,MAAM,IAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,SAAS,aAAa;AAChC,WAAK,UAAU,EAAE,MAAM,IAAI;AAAA,IAC5B;AAEA,SAAK;AAEL,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAO,KAAK;AACrB,QAAI,OAAO,QAAQ,aAAa;AAC/B,aAAO,KAAK,UAAU,SAAS,OAAO,GAAG;AAAA,IAC1C,OAAO;AACN,aAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAO,KAAK;AACpB,QAAI,OAAO,QAAQ,aAAa;AAC/B,aAAO,KAAK,UAAU,SAAS,OAAO,GAAG;AAAA,IAC1C,OAAO;AACN,aAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,gBAAgB;AAAA,EAC7B;AACD;;;AC1HA,IAAqB,aAArB,MAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc/B,YAAYC,WAAU,UAAU;AAC/B,SAAK,KAAKA,WAAU,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAKA,WAAU,UAAU;AAExB,SAAK,WAAWA;AAGhB,SAAK,KAAKA,UAAS;AAGnB,SAAK,QAAQA,UAAS;AAGtB,SAAK,aAAaA,UAAS;AAM3B,SAAK,gBAAgB;AAMrB,SAAK,gBAAgB;AAOrB,SAAK,OAAO,KAAK,GAAG;AAOpB,SAAK,aAAa,CAAC;AAQnB,SAAK,iBAAiB;AAQtB,SAAK,aAAa;AAMlB,SAAK,aAAa;AAGlB,QAAI,OAAO,aAAa,eAAe,MAAM,QAAQ,SAAS,UAAU,GAAG;AAC1E,eAAS,WAAW,QAAQ,CAAC,SAAS;AACrC,aAAK;AAAA,UACJ,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACN;AACA,aAAK,aAAa,IAAI,kBAAkB,KAAK,YAAY,CAAC;AAAA,MAC3D,CAAC;AAAA,IACF,OAAO;AACN,YAAM,IAAI,MAAM,+BAA+B;AAAA,IAChD;AAGA,QACC,OAAO,aAAa,eACpB,OAAO,SAAS,WAAW,aAC1B;AACD,WAAK,gBAAgB,IAAI;AAAA,QACxB,KAAK;AAAA,QACL,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MACjB;AAAA,IACD,OAAO;AACN,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC5C;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAEP,SAAK,KAAK,KAAK,SAAS;AAGxB,SAAK,WAAW,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACN,QAAI,KAAK,SAAS,mBAAmB,KAAK,cAAc,SAAS;AAChE,WAAK,UAAU,KAAK,aAAa;AAAA,IAClC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,QAAQ;AACjB,QAAI,KAAK,SAAS,mBAAmB,OAAO,SAAS;AACpD,WAAK,MAAM;AACX,aAAO,KAAK;AACZ,aAAO,WAAW,qBAAqB,KAAK,SAAS,gBAAgB;AACrE,aAAO,oBAAoB,KAAK,IAAI,KAAK,YAAY,KAAK,cAAc;AAExE,WAAK,gBAAgB;AACrB,WAAK,SAAS,iBAAiB,KAAK,cAAc;AAAA,IACnD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,MAAM,MAAM,MAAM,YAAY,QAAQ;AAClD,SAAK,WAAW,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAED,YAAQ,MAAM;AAAA,MACb,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,UAAU;AACxC;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,WAAW;AACzC;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,WAAW;AACzC;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,YAAY;AAC1C;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,WAAW;AACzC;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,YAAY;AAC1C;AAAA,MACD,KAAK,KAAK,GAAG;AACZ,aAAK,kBAAkB,OAAO,aAAa;AAC3C;AAAA,MACD;AACC,cAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,SAAK,aAAa,KAAK,iBAAiB,aAAa;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAAQ;AACrB,SAAK,cAAc,WAAW,qBAAqB,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,KAAK,MAAM;AACvB,UAAM,SAAS,KAAK;AACpB,UAAM,cAAc,OAAO;AAE3B,QAAI,cAAc,GAAG;AACpB,YAAM,KAAK,KAAK;AAChB,YAAM,aAAa,OAAO;AAG1B,UAAI,KAAK,SAAS,eAAe,GAAG;AACnC,WAAG;AAAA,UACF,GAAG;AAAA,UACH,OAAO,UAAU;AAAA,UACjB,GAAG;AAAA,UACH;AAAA,UACA,cAAc;AAAA,QACf;AAAA,MACD,OAAO;AACN,WAAG;AAAA,UACF,GAAG;AAAA,UACH,OAAO,UAAU,GAAG,cAAc,UAAU;AAAA,UAC5C,GAAG;AAAA,QACJ;AAAA,MACD;AAEA,SAAG,WAAW,MAAM,GAAG,WAAW;AAGlC,aAAO,MAAM;AAAA,IACd;AAAA,EACD;AACD;;;AC/OA,IAAqB,sBAArB,cAAiD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3D,KAAKC,WAAU;AACd,UAAM,KAAKA,WAAU;AAAA,MACpB,YAAY;AAAA,QACX;AAAA,UACC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,UAAS,GAAG;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ,IAAI,aAAa;AAAA,QAC1B;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,UAAS,GAAG;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ,IAAI,aAAa;AAAA,QAC1B;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,QACP,QAAQC;AAAA,QACR,UAAU;AAAA,MACX;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAM,OAAO,cAAc,MAAM,QAAQ;AACrD,UAAM,aAAa,KAAK;AACxB,UAAM,aAAa,KAAK;AACxB,UAAMC,SAAQ,KAAK,SAAS,eAAe;AAC3C,UAAM,cAAc,KAAK,SAAS,aAAa,SAASA,MAAK;AAE7D,QAAI,WAAW,OAAO,WAAW,GAAG;AAEnC,WAAK,MAAM;AAAA,IACZ;AAGA,QAAI,SAAS,KAAK,MAAM;AACvB,WAAK,MAAM,KAAK,IAAI;AACpB,WAAK,OAAO;AAAA,IACb;AAEA,QAAI,CAAC,WAAW,WAAW,GAAG;AAC7B,YAAM,QAAQ,CAAC,SAAS;AACvB,mBAAW,MAAM,IAAI;AACrB,mBAAW,KAAK,KAAK,GAAG,KAAK,GAAG,QAAW,QAAW,WAAW;AAAA,MAClE,CAAC;AAAA,IACF,OAAO;AACN,YAAM,QAAQ,CAAC,SAAS;AACvB,mBAAW,KAAK,KAAK,GAAG,KAAK,GAAG,QAAW,QAAW,WAAW;AAAA,MAClE,CAAC;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,KAAK,GAAG,cAAc,KAAK,SAAS,KAAK,GAAG,WAAW;AACxE,WAAK,MAAM,KAAK,IAAI;AAAA,IACrB;AAAA,EACD;AACD;;;AClFA;;;ACAA,IAAAC,gBAAA;;;ACYA,IAAM,UAAU;AAAA,EACf,IAAI,SAAS;AAAA,EACb,IAAI,SAAS;AAAA,EACb,IAAI,SAAS;AAAA,EACb,IAAI,SAAS;AACd;AAMA,IAAqB,iBAArB,cAA4C,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtD,KAAKC,WAAU;AACd,UAAM,KAAKA,WAAU;AAAA,MACpB,YAAY;AAAA,QACX;AAAA,UACC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,UAAS,GAAG;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ,IAAI,aAAa;AAAA,QAC1B;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,UAAS,GAAG;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ,IAAI,aAAa;AAAA,QAC1B;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,UAAS,GAAG;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ,IAAI,aAAa;AAAA,QAC1B;AAAA,MACD;AAAA,MACA,QAAQ;AAAA,QACP,QAAQC;AAAA,QACR,UAAU;AAAA,MACX;AAAA,IACD,CAAC;AAGD,SAAK,qBAAqB;AAC1B,SAAK,gBAAgB,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,UAAM,MAAM;AAGZ,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,aAAa,KAAK;AACnD,YAAM,YAAY,KAAK,aAAa,CAAC;AACrC,UAAI,OAAO,cAAc,aAAa;AACrC,aAAK,gBAAgB,SAAS;AAAA,MAC/B;AAAA,IACD;AACA,SAAK,qBAAqB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,gBACC,MACA,SAAS,MACT,QACA,SAAS,aACT,IAAI,OAAO,OACX,IAAI,OAAO,QACX,qBAAqB,MACrB,SAAS,MACT,SACC;AACD,UAAM,KAAK,KAAK;AAChB,UAAM,QAAQ,aAAa,CAAC,KAAK,aAAa,CAAC;AAC/C,UAAM,KACL,OAAO,OAAO,eAAe,MAAM,MAClC,SAAS,KAAK,SAAS,eAAe,KACpC,GAAG,SACH,GAAG;AACP,UAAM,KACL,OAAO,OAAO,eAAe,MAAM,MAClC,SAAS,KAAK,SAAS,eAAe,KACpC,GAAG,SACH,GAAG;AAEP,QAAI,iBAAiB;AACrB,QAAI,CAAC,gBAAgB;AACpB,uBAAiB,GAAG,cAAc;AAAA,IACnC;AAEA,SAAK,cAAc,gBAAgB,IAAI;AAEvC,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,EAAE;AACrD,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,EAAE;AACrD,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,MAAM;AAC7D,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,MAAM;AAE7D,OAAG,YAAY,GAAG,gCAAgC,kBAAkB;AAEpE,QAAI,WAAW,QAAQ,OAAO,OAAO,eAAe,aAAa;AAEhE,SAAG;AAAA,QACF,GAAG;AAAA,QACH;AAAA,QACA,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACD;AAAA,IACD,WACC,OAAO,WAAW,oBAAoB,eACtC,kBAAkB,WAAW,iBAC5B;AAED,YAAM,cAAc,OAAO,sBAAsB;AACjD,SAAG;AAAA,QACF,GAAG;AAAA,QACH;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACD;AACA,kBAAY,MAAM;AAAA,IACnB,OAAO;AACN,SAAG;AAAA,QACF,GAAG;AAAA,QACH;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACD;AAAA,IACD;AAGA,QAAI,SAAS,WAAW,MAAM;AAC7B,SAAG,eAAe,GAAG,UAAU;AAAA,IAChC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,SAAS;AACxB,SAAK,GAAG,cAAc,OAAO;AAC7B,SAAK,gBAAgB,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,MAAM;AAClB,WAAO,KAAK,cAAc,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAS,MAAM;AAC5B,UAAM,KAAK,KAAK;AAEhB,QAAI,YAAY,KAAK,cAAc,IAAI,GAAG;AACzC,WAAK,MAAM;AACX,UAAI,KAAK,uBAAuB,MAAM;AACrC,aAAK,qBAAqB;AAC1B,WAAG,cAAc,GAAG,WAAW,IAAI;AAAA,MACpC;AAEA,SAAG,YAAY,GAAG,YAAY,OAAO;AACrC,WAAK,cAAc,IAAI,IAAI;AAAA,IAC5B,WAAW,KAAK,uBAAuB,MAAM;AAC5C,WAAK,MAAM;AACX,WAAK,qBAAqB;AAC1B,SAAG,cAAc,GAAG,WAAW,IAAI;AAAA,IACpC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,SAAS,MAAM;AAC9B,QAAI,OAAO,SAAS,aAAa;AAChC,aAAO,KAAK,cAAc,QAAQ,OAAO;AAAA,IAC1C;AACA,QAAI,SAAS,IAAI;AAChB,aAAO,KAAK,cAAc,IAAI;AAC9B,UAAI,SAAS,KAAK,oBAAoB;AACrC,aAAK,qBAAqB;AAAA,MAC3B;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAS,GAAG,GAAG,QAAQ,OAAO;AAC3C,UAAM,OAAO,KAAK,SAAS,MAAM,QAAQ,OAAO;AAChD,UAAM,YAAY,KAAK,cAAc,IAAI;AAEzC,QAAI,OAAO,cAAc,eAAe,OAAO;AAC9C,WAAK;AAAA,QACJ;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB,KAAK,SAAS,SAAS,YAAY,KAAK,GAAG,SAAS,KAAK,GAAG;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACD;AAAA,IACD,OAAO;AACN,WAAK,cAAc,WAAW,IAAI;AAAA,IACnC;AAEA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,SAAS,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,WAAW,OAAO;AACpE,UAAM,aAAa,KAAK;AAExB,QAAI,WAAW,OAAO,CAAC,GAAG;AAEzB,WAAK,MAAM;AAAA,IACZ;AAGA,UAAM,OAAO,KAAK,cAAc,SAAS,GAAG,GAAG,QAAQ;AAGvD,SAAK,cAAc,WAAW,YAAY,IAAI;AAG9C,UAAM,IAAI,KAAK;AACf,UAAM,OAAO,QAAQ,CAAC,EAAE,IAAI,GAAG,CAAC;AAChC,UAAM,OAAO,QAAQ,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AACpC,UAAM,OAAO,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;AACpC,UAAM,OAAO,QAAQ,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC;AAExC,QAAI,CAAC,EAAE,WAAW,GAAG;AACpB,QAAE,MAAM,IAAI;AACZ,QAAE,MAAM,IAAI;AACZ,QAAE,MAAM,IAAI;AACZ,QAAE,MAAM,IAAI;AAAA,IACb;AAEA,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC5C,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC5C,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC5C,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC5C,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAC5C,eAAW,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI;AAAA,EAC7C;AACD;;;AC9RA,IAAI;AAKJ,IAAqB,gBAArB,cAA2C,SAAS;AAAA;AAAA;AAAA;AAAA,EAInD,YAAY,SAAS;AAEpB,UAAM,OAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC;AAQlD,SAAK,YAAY;AAQjB,SAAK,cAAc;AAOnB,SAAK,KAAK,KAAK,aAAa;AAU5B,SAAK,YAAY;AAQjB,SAAK,WAAW;AAMhB,SAAK,eAAe,KAAK,GAAG,aAAa;AAOzC,SAAK,cAAc,KAAK,GAAG,aAAa,KAAK,GAAG,uBAAuB;AAKvE,SAAK,cAAc,CAAC;AAKpB,SAAK,eAAe,CAAC;AAKrB,SAAK,gBAAgB,CAAC;AAKtB,SAAK,cAAc,CAAC;AAMpB,SAAK,mBAAmB,IAAI,SAAS;AAMrC,SAAK,oBAAoB;AAMzB,SAAK,iBAAiB;AAMtB,SAAK,cAAc,oBAAI,IAAI;AAG3B,SAAK,GAAG,WAAW,KAAK,GAAG,cAAc,KAAK,YAAY;AAG1D,SAAK;AAAA,MACJ,KAAK,KAAK,SAAS,cAAc,gBAAgB,IAAI;AAAA,MACrD;AAAA,MACA;AAAA,IACD;AACA,SAAK;AAAA,MACJ,KAAK,KAAK,SAAS,cAAc,qBAAqB,IAAI;AAAA,MAC1D;AAAA,IACD;AAGA,SAAK,YAAY,QAAQ;AAGzB,QAAI,KAAK,cAAc,YAAY;AAClC,WAAK,GAAG,OAAO,KAAK,GAAG,UAAU;AAEjC,WAAK,GAAG,UAAU,KAAK,GAAG,MAAM;AAChC,WAAK,GAAG,UAAU,IAAI;AAAA,IACvB,OAAO;AACN,WAAK,GAAG,QAAQ,KAAK,GAAG,UAAU;AAClC,WAAK,GAAG,UAAU,KAAK;AAAA,IACxB;AAEA,SAAK,GAAG,QAAQ,KAAK,GAAG,YAAY;AACpC,SAAK,GAAG,OAAO,KAAK,GAAG,KAAK;AAG5B,SAAK,aAAa,KAAK,SAAS,SAAS;AAGzC,UAAM,YAAY,KAAK,GAAG,aAAa,2BAA2B;AAClE,QAAI,cAAc,MAAM;AACvB,WAAK,YAAY,KAAK,GAAG,aAAa,UAAU,qBAAqB;AACrE,WAAK,cAAc,KAAK,GAAG;AAAA,QAC1B,UAAU;AAAA,MACX;AAAA,IACD;AAIA,SAAK,eAAe;AAGpB,SAAK,QAAQ,IAAI,cAAa,KAAK,WAAW;AAG9C,SAAK,OAAO,UAAU,KAAK;AAK3B,SAAK,UAAU,EAAE;AAAA,MAChB;AAAA,MACA,CAAC,MAAM;AACN,UAAE,eAAe;AACjB,aAAK,iBAAiB;AACtB,qBAAa,KAAK,gBAAgB,IAAI;AAAA,MACvC;AAAA,MACA;AAAA,IACD;AAEA,SAAK,UAAU,EAAE;AAAA,MAChB;AAAA,MACA,MAAM;AACL,aAAK,MAAM;AACX,aAAK,iBAAiB;AACtB,qBAAa,KAAK,oBAAoB,IAAI;AAAA,MAC3C;AAAA,MACA;AAAA,IACD;AAGA,iBAAa,YAAY,YAAY,MAAM;AAC1C,WAAK,MAAM;AAAA,IACZ,CAAC;AAGD,iBAAa,YAAY,iBAAiB,CAAC,OAAO,WAAW;AAC5D,WAAK,MAAM;AACX,WAAK,YAAY,GAAG,GAAG,OAAO,MAAM;AAAA,IACrC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,eAAe;AAClB,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uCAAuC;AACtC,QAAI,OAAO,sCAAsC,aAAa;AAC7D,YAAM,KAAK,KAAK;AAChB,0CAAoC;AAAA,QACnC,MACC,GAAG,aAAa,+BAA+B,KAC/C,KAAK,IAAI,aAAa,sCAAsC;AAAA,QAC7D,MACC,GAAG,aAAa,8BAA8B,KAC9C,KAAK,IAAI,aAAa,qCAAqC;AAAA,QAC5D,MACC,GAAG,aAAa,+BAA+B,KAC/C,KAAK,IAAI,aAAa,sCAAsC;AAAA,QAC7D,WACC,GAAG,aAAa,oCAAoC,KACpD,KAAK,IAAI,aAAa,2CAA2C;AAAA,QAClE,OACC,GAAG,aAAa,gCAAgC,KAChD,KAAK,IAAI,aAAa,uCAAuC;AAAA,QAC9D,MACC,GAAG,aAAa,+BAA+B,KAC/C,KAAK,IAAI,aAAa,sCAAsC;AAAA,QAC7D,MACC,GAAG,aAAa,8BAA8B,KAC9C,GAAG,aAAa,qCAAqC,KACrD,GAAG,aAAa,gCAAgC;AAAA,MAClD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,8BAA8B,QAAQ;AACrC,UAAM,mBAAmB,KAAK,qCAAqC;AACnE,eAAW,mBAAmB,kBAAkB;AAC/C,iBAAW,aAAa,iBAAiB,eAAe,GAAG;AAC1D,YAAI,WAAW,iBAAiB,eAAe,EAAE,SAAS,GAAG;AAC5D,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,UAAM,MAAM;AAGZ,SAAK,YAAY,QAAQ,CAAC,UAAU;AACnC,gBAAU,QAAQ,KAAK;AAAA,IACxB,CAAC;AACD,SAAK,aAAa,QAAQ,CAAC,WAAW;AACrC,mBAAa,QAAQ,MAAM;AAAA,IAC5B,CAAC;AACD,SAAK,YAAY,SAAS;AAC1B,SAAK,aAAa,SAAS;AAC3B,SAAK,YAAY,SAAS;AAG1B,SAAK,MAAM;AAGX,SAAK,YAAY;AAGjB,QACC,KAAK,GAAG,aAAa,KAAK,GAAG,oBAAoB,MAAM,KAAK,cAC3D;AACD,WAAK,GAAG,WAAW,KAAK,GAAG,cAAc,KAAK,YAAY;AAAA,IAC3D;AAEA,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,eAAe;AAEpB,SAAK,YAAY,QAAQ,CAAC,eAAe;AACxC,UAAI,KAAK,mBAAmB,OAAO;AAElC,mBAAW,KAAK,IAAI;AAAA,MACrB,OAAO;AACN,mBAAW,MAAM;AAAA,MAClB;AAAA,IACD,CAAC;AAED,SAAK,cAAc,MAAM;AAEzB,SAAK,GAAG,QAAQ,KAAK,GAAG,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,YAAY,OAAO,WAAW,WAAW,OAAO;AAE7D,QAAI,OAAO,KAAK,YAAY,IAAI,IAAI,MAAM,aAAa;AACtD,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC1C;AAGA,SAAK,YAAY,IAAI,MAAM,UAAU;AAErC,QAAI,aAAa,MAAM;AAEtB,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,OAAO,WAAW,SAAS,KAAK,cAAc;AAC3D,UAAM,aAAa,KAAK,YAAY,IAAI,IAAI;AAE5C,QAAI,OAAO,eAAe,aAAa;AACtC,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACrC;AAEA,QAAI,KAAK,sBAAsB,YAAY;AAC1C,UAAI,KAAK,sBAAsB,QAAW;AAEzC,aAAK,kBAAkB,MAAM;AAAA,MAC9B;AAEA,WAAK,oBAAoB;AAAA,IAC1B;AAEA,QAAI,SAAS,UAAU,OAAO,WAAW,UAAU;AAClD,WAAK,kBAAkB,UAAU,MAAM;AAAA,IACxC,OAAO;AAEN,WAAK,kBAAkB,KAAK;AAAA,IAC7B;AAEA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAChB,SAAK,iBAAiB,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAc,OAAO,QAAQ;AAC5B,SAAK,cAAc,MAAM;AAEzB,QACC,SAAS,iBAAiB,MACzB,CAAC,aAAa,MAAM,KAAK,KAAK,CAAC,aAAa,MAAM,MAAM,IACxD;AACD,YAAM,MAAM,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAC3D,YAAM,IAAI;AAAA,QACT,sBACC,MACA,4BAEA,MAAM,QACN,MACA,MAAM,SACN;AAAA,MACF;AAAA,IACD;AAEA,UAAM,UAAU,IAAI;AAAA,MACnB,YAAY,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM;AAAA,MACxD;AAAA,IACD;AAGA,SAAK,kBAAkB,cAAc,OAAO;AAE5C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,SAAK,kBAAkB,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAAQ;AACrB,UAAM,cAAc,MAAM;AAC1B,SAAK,kBAAkB,cAAc,MAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACC,IAAI,GACJ,IAAI,GACJ,IAAI,KAAK,UAAU,EAAE,OACrB,IAAI,KAAK,UAAU,EAAE,QACpB;AACD,SAAK,GAAG,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACP,UAAM,KAAK,KAAK;AAChB,UAAM,aAAa,KAAK,gBAAgB,QAAQ;AAChD,OAAG,WAAW,WAAW,CAAC,GAAG,WAAW,CAAC,GAAG,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AACxE,SAAK,YAAY;AACjB,QAAI,KAAK,cAAc,YAAY;AAClC,SAAG;AAAA,QACF,GAAG,mBAAmB,GAAG,mBAAmB,GAAG;AAAA,MAChD;AAAA,IACD,OAAO;AACN,SAAG,MAAM,GAAG,mBAAmB,GAAG,kBAAkB;AAAA,IACrD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAQ,WAAW,SAAS,OAAO;AAC7C,QAAI;AACJ,UAAM,KAAK,KAAK;AAEhB,QAAI,iBAAiB,OAAO;AAC3B,gBAAU,MAAM,QAAQ;AAAA,IACzB,OAAO;AACN,YAAM,SAAS,UAAU,IAAI;AAE7B,gBAAU,OAAO,SAAS,KAAK,EAAE,QAAQ;AACzC,gBAAU,QAAQ,MAAM;AAAA,IACzB;AAGA,OAAG;AAAA,MACF,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,WAAW,OAAO,IAAM,QAAQ,CAAC;AAAA,IAClC;AACA,OAAG,MAAM,GAAG,gBAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,GAAG,GAAG,OAAO,QAAQ;AAC9B,SAAK,KAAK;AACV,SAAK,SAAS,GAAG,GAAG,OAAO,MAAM;AACjC,SAAK,WAAW;AAChB,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,UAAU,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAChD,QAAI,OAAO,OAAO,aAAa;AAC9B,WAAK,KAAK,MAAM;AAChB,WAAK,KAAK,MAAM;AAChB,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK;AAAA,IACN,WAAW,OAAO,OAAO,aAAa;AACrC,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK;AACL,WAAK,MAAM;AACX,WAAK,MAAM;AACX,WAAK;AACL,WAAK;AAAA,IACN;AAEA,QAAI,KAAK,SAAS,aAAa,OAAO;AAErC,YAAM;AACN,YAAM;AAAA,IACP;AAEA,SAAK,cAAc,MAAM;AAEzB,UAAM,WAAW,OAAO,MAAM,eAAe;AAC7C,UAAM,UAAU,KAAK,MAAM,IAAI,KAAK;AACpC,UAAM,MAAM,QAAQ,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,EAAE;AAC9D,SAAK,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,KAAK,YAAY,SAAS,KAAK,eAAe,CAAC;AAAA,MAC/C;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,SAAS,GAAG,GAAG,OAAO,QAAQ;AACzC,UAAM,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,MAAM;AACxD,SAAK,cAAc,MAAM;AACzB,SAAK,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,IAAI,CAAC;AAAA,MACL,KAAK,YAAY,SAAS,KAAK,eAAe,CAAC;AAAA,IAChD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,YAAY;AACX,SAAK,OAAO,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG,GAAG;AACZ,SAAK,OAAO,OAAO,GAAG,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG,GAAG;AACZ,SAAK,OAAO,OAAO,GAAG,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,GAAG,GAAG,OAAO,QAAQ;AACzB,SAAK,OAAO,KAAK,GAAG,GAAG,OAAO,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,GAAG,GAAG,OAAO,QAAQ,OAAO;AACrC,SAAK,OAAO,UAAU,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAO,MAAM;AACnB,SAAK,cAAc,WAAW;AAC9B,QAAI,OAAO,UAAU,aAAa;AACjC,UAAI,SAAS,MAAM;AAElB,aAAK,kBAAkB;AAAA,UACtB,KAAK,GAAG;AAAA,UACR,KAAK,OAAO,gBAAgB;AAAA,QAC7B;AAAA,MACD,OAAO;AACN,aAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,MACtE;AAAA,IACD,OAAO;AACN,YAAM,OAAO,OAAO,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAO;AACX,SAAK,OAAO,OAAO,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACX,SAAK,OAAO,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAa,OAAO,UAAU,KAAK,KAAK,IAAI;AAC3C,QAAI,KAAK,qBAAqB,MAAM;AACnC,WAAK,MAAM;AACX,SAAG,OAAO,GAAG,KAAK;AAClB,WAAK,mBAAmB;AAExB,cAAQ,MAAM;AAAA,QACb,KAAK;AACJ,aAAG,UAAU,GAAG,KAAK,GAAG,mBAAmB;AAC3C;AAAA,QAED,KAAK;AAAA,QACL,KAAK;AACJ,aAAG,UAAU,GAAG,KAAK,GAAG,GAAG;AAC3B;AAAA,QAED,KAAK;AACJ,aAAG,UAAU,GAAG,WAAW,GAAG,mBAAmB;AACjD;AAAA,QAED;AACC,aAAG,UAAU,GAAG,KAAK,GAAG,mBAAmB;AAC3C,eAAK,mBAAmB;AACxB;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAAU;AAET,QAAI,KAAK,aAAa,WAAW,GAAG;AACnC,YAAM,QAAQ,KAAK,YAAY,IAAI;AACnC,YAAM,SAAS,KAAK,aAAa,IAAI;AAGrC,WAAK,aAAa,KAAK,KAAK;AAC5B,WAAK,iBAAiB,KAAK,MAAM;AAEjC,WAAK,aAAa,KAAK,YAAY,IAAI,CAAC;AAGxC,gBAAU,QAAQ,KAAK;AACvB,mBAAa,QAAQ,MAAM;AAAA,IAC5B;AAEA,QAAI,KAAK,cAAc,WAAW,GAAG;AAEpC,WAAK,eAAe,IAAI,KAAK,cAAc,IAAI,CAAC;AAAA,IACjD,OAAO;AACN,YAAM,SAAS,KAAK,UAAU;AAE9B,WAAK,GAAG,QAAQ,KAAK,GAAG,YAAY;AACpC,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI,OAAO;AAChC,WAAK,eAAe,CAAC,IAAI,OAAO;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO;AACN,SAAK,YAAY,KAAK,KAAK,aAAa,MAAM,CAAC;AAC/C,SAAK,aAAa,KAAK,KAAK,iBAAiB,MAAM,CAAC;AAEpD,QAAI,KAAK,GAAG,UAAU,KAAK,GAAG,YAAY,GAAG;AAE5C,WAAK,cAAc,KAAK,KAAK,eAAe,MAAM,CAAC;AAAA,IACpD;AAEA,SAAK,YAAY,KAAK,KAAK,aAAa,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,OAAO;AACb,SAAK,iBAAiB,OAAO,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAG,GAAG;AACX,SAAK,iBAAiB,MAAM,GAAG,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAaC,UAAS,OAAO;AAC5B,UAAM,aAAaA,OAAM;AAAA,EAE1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAeC,QAAO;AACrB,SAAK,aAAa,QAAQA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAChB,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAO;AACf,UAAMA,SAAQ,KAAK,aAAa;AAChC,SAAK,aAAa,KAAK,KAAK;AAC5B,SAAK,aAAa,SAASA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAG,GAAG,QAAQ,OAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AACxE,SAAK,cAAc,WAAW;AAC9B,SAAK,OAAO,UAAU;AACtB,SAAK,OAAO,IAAI,GAAG,GAAG,QAAQ,OAAO,KAAK,aAAa;AACvD,QAAI,SAAS,OAAO;AACnB,WAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,IACtE,OAAO;AACN,WAAK,kBAAkB;AAAA,QACtB,KAAK,GAAG;AAAA,QACR,KAAK,OAAO,gBAAgB;AAAA,MAC7B;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,GAAG,GAAG,QAAQ,OAAO,KAAK,gBAAgB,OAAO;AACxD,SAAK,UAAU,GAAG,GAAG,QAAQ,OAAO,KAAK,eAAe,IAAI;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AACvC,SAAK,cAAc,WAAW;AAC9B,SAAK,OAAO,UAAU;AACtB,SAAK,OAAO,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzC,QAAI,SAAS,OAAO;AACnB,WAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,IACtE,OAAO;AACN,WAAK,kBAAkB;AAAA,QACtB,KAAK,GAAG;AAAA,QACR,KAAK,OAAO,gBAAgB;AAAA,MAC7B;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,GAAG,GAAG,GAAG,GAAG;AACvB,SAAK,cAAc,GAAG,GAAG,GAAG,GAAG,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,QAAQ,QAAQ,MAAM,MAAM;AACtC,SAAK,cAAc,WAAW;AAC9B,QAAI,KAAK,cAAc,GAAG;AACzB,WAAK,OAAO,UAAU;AACtB,WAAK,OAAO,OAAO,QAAQ,MAAM;AACjC,WAAK,OAAO,OAAO,MAAM,IAAI;AAC7B,WAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,IACtE,WAAW,KAAK,YAAY,GAAG;AAC9B,YAAM,YAAY,KAAK,YAAY;AACnC,YAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,OAAO,MAAM;AACrD,YAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,YAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,OAAO;AAElB,WAAK,OAAO,UAAU;AACtB,WAAK,OAAO,OAAO,IAAI,EAAE;AACzB,WAAK,OAAO,OAAO,IAAI,EAAE;AACzB,WAAK,OAAO,OAAO,IAAI,EAAE;AACzB,WAAK,OAAO,OAAO,IAAI,EAAE;AACzB,WAAK,OAAO,UAAU;AAEtB,WAAK,kBAAkB;AAAA,QACtB,KAAK,GAAG;AAAA,QACR,KAAK,OAAO,gBAAgB;AAAA,MAC7B;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,QAAQ,QAAQ,MAAM,MAAM;AACpC,SAAK,WAAW,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAM,OAAO,OAAO;AACjC,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AAEnB,SAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAErC,QAAI,SAAS,SAAS,KAAK,YAAY,GAAG;AACzC,YAAM,SAAS,KAAK,YAAY;AAChC,eAAS,IAAI,GAAG,IAAI,MAAM,GAAG,KAAK;AACjC,cAAM,WAAW,OAAO,CAAC;AACzB,cAAM,YAAY,OAAO,IAAI,CAAC;AAC9B,aAAK,YAAY,UAAU,GAAG,UAAU,GAAG,QAAQ,MAAM;AACzD,aAAK,WAAW,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAAA,MACjE;AACA,YAAM,YAAY,OAAO,MAAM,CAAC;AAChC,YAAM,aAAa,OAAO,CAAC;AAC3B,UAAI,CAAC,UAAU,OAAO,UAAU,GAAG;AAClC,aAAK,YAAY,WAAW,GAAG,WAAW,GAAG,QAAQ,MAAM;AAC3D,aAAK,WAAW,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAAA,MACrE;AAAA,IACD,OAAO;AACN,WAAK,cAAc,WAAW;AAC9B,WAAK,OAAO,UAAU;AACtB,eAAS,IAAI,GAAG,IAAI,MAAM,GAAG,KAAK;AACjC,cAAM,WAAW,OAAO,CAAC;AACzB,cAAM,YAAY,OAAO,IAAI,CAAC;AAC9B,aAAK,OAAO,OAAO,SAAS,GAAG,SAAS,CAAC;AACzC,aAAK,OAAO,OAAO,UAAU,GAAG,UAAU,CAAC;AAAA,MAC5C;AACA,WAAK,OAAO,UAAU;AACtB,UAAI,SAAS,OAAO;AACnB,aAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,MACtE,OAAO;AAEN,aAAK,kBAAkB;AAAA,UACtB,KAAK,GAAG;AAAA,UACR,KAAK,OAAO,gBAAgB;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AAEA,SAAK,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,MAAM;AACjB,SAAK,cAAc,MAAM,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAW,GAAG,GAAG,OAAO,QAAQ,OAAO,OAAO;AAC7C,QAAI,SAAS,SAAS,KAAK,YAAY,GAAG;AACzC,YAAM,SAAS,KAAK,YAAY;AAChC,WAAK,WAAW,GAAG,GAAG,IAAI,OAAO,CAAC;AAClC,WAAK,WAAW,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,MAAM;AACnD,WAAK,WAAW,IAAI,OAAO,IAAI,QAAQ,GAAG,IAAI,MAAM;AACpD,WAAK,WAAW,GAAG,IAAI,QAAQ,GAAG,CAAC;AACnC,WAAK,YAAY,GAAG,GAAG,QAAQ,MAAM;AACrC,WAAK,YAAY,IAAI,OAAO,GAAG,QAAQ,MAAM;AAC7C,WAAK,YAAY,IAAI,OAAO,IAAI,QAAQ,QAAQ,MAAM;AACtD,WAAK,YAAY,GAAG,IAAI,QAAQ,QAAQ,MAAM;AAAA,IAC/C,OAAO;AACN,WAAK,cAAc,WAAW;AAC9B,WAAK,OAAO,UAAU;AACtB,WAAK,OAAO,KAAK,GAAG,GAAG,OAAO,MAAM;AACpC,UAAI,SAAS,OAAO;AACnB,aAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,MACtE,OAAO;AACN,aAAK,kBAAkB;AAAA,UACtB,KAAK,GAAG;AAAA,UACR,KAAK,OAAO,gBAAgB;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,GAAG,GAAG,OAAO,QAAQ;AAC7B,SAAK,WAAW,GAAG,GAAG,OAAO,QAAQ,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBAAgB,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAC1D,SAAK,cAAc,WAAW;AAC9B,SAAK,OAAO,UAAU;AACtB,SAAK,OAAO,UAAU,GAAG,GAAG,OAAO,QAAQ,MAAM;AACjD,QAAI,SAAS,OAAO;AACnB,WAAK,kBAAkB,aAAa,KAAK,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,IACtE,OAAO;AACN,WAAK,kBAAkB;AAAA,QACtB,KAAK,GAAG;AAAA,QACR,KAAK,OAAO,gBAAgB;AAAA,MAC7B;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,GAAG,GAAG,OAAO,QAAQ,QAAQ;AAC1C,SAAK,gBAAgB,GAAG,GAAG,OAAO,QAAQ,QAAQ,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,GAAG,GAAG;AACjB,SAAK,WAAW,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAG,GAAG;AACf,SAAK,YAAY,GAAG,CAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC9B,SAAK,eAAe;AACpB,SAAK,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC3B,QAAI,OAAO,MAAM,UAAU;AAC1B,WAAK,iBAAiB,SAAS,CAAC;AAAA,IACjC,OAAO;AAEN,WAAK,iBAAiB,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,IACjD;AACA,QAAI,KAAK,SAAS,aAAa,OAAO;AAErC,YAAMC,KAAI,KAAK,iBAAiB,QAAQ;AACxC,MAAAA,GAAE,CAAC,KAAK;AACR,MAAAA,GAAE,CAAC,KAAK;AAAA,IACT;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAG,GAAG;AACf,UAAM,mBAAmB,KAAK;AAC9B,qBAAiB,UAAU,GAAG,CAAC;AAC/B,QAAI,KAAK,SAAS,aAAa,OAAO;AAErC,YAAM,IAAI,iBAAiB,QAAQ;AACnC,QAAE,CAAC,KAAK;AACR,QAAE,CAAC,KAAK;AAAA,IACT;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,GAAG,GAAG,OAAO,QAAQ;AAC7B,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,KAAK,KAAK;AAEhB,QACC,MAAM,KACN,MAAM,KACN,UAAU,OAAO,SACjB,WAAW,OAAO,QACjB;AACD,YAAM,iBAAiB,KAAK;AAC5B,UAAI,GAAG,UAAU,GAAG,YAAY,GAAG;AAElC,YACC,eAAe,CAAC,MAAM,KACtB,eAAe,CAAC,MAAM,KACtB,eAAe,CAAC,MAAM,SACtB,eAAe,CAAC,MAAM,QACrB;AACD;AAAA,QACD;AAAA,MACD;AAEA,WAAK,MAAM;AAEX,SAAG,OAAO,KAAK,GAAG,YAAY;AAE9B,SAAG;AAAA;AAAA,QAEF,IAAI,KAAK,iBAAiB;AAAA,QAC1B,OAAO,SAAS,SAAS,IAAI,KAAK,iBAAiB;AAAA,QACnD;AAAA,QACA;AAAA,MACD;AAEA,qBAAe,CAAC,IAAI;AACpB,qBAAe,CAAC,IAAI;AACpB,qBAAe,CAAC,IAAI;AACpB,qBAAe,CAAC,IAAI;AAAA,IACrB,OAAO;AAEN,SAAG,QAAQ,GAAG,YAAY;AAAA,IAC3B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,MAAM,SAAS,OAAO;AAC7B,UAAM,KAAK,KAAK;AAGhB,SAAK,MAAM;AAEX,QAAI,KAAK,cAAc,GAAG;AAEzB,SAAG,OAAO,GAAG,YAAY;AACzB,SAAG,MAAM,GAAG,kBAAkB;AAAA,IAC/B;AAEA,SAAK;AAEL,OAAG,UAAU,OAAO,OAAO,OAAO,KAAK;AACvC,OAAG,YAAY,GAAG,OAAO,KAAK,WAAW,CAAC;AAC1C,OAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;AAG/C,SAAK,KAAK,IAAI;AAGd,SAAK,MAAM;AAEX,OAAG,UAAU,MAAM,MAAM,MAAM,IAAI;AAGnC,QAAI,WAAW,MAAM;AACpB,SAAG,YAAY,GAAG,OAAO,KAAK,YAAY,GAAG,CAAC;AAAA,IAC/C,OAAO;AACN,SAAG,YAAY,GAAG,UAAU,KAAK,YAAY,GAAG,CAAC;AAAA,IAClD;AACA,OAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,QAAI,KAAK,YAAY,GAAG;AAEvB,WAAK,MAAM;AACX,WAAK,YAAY;AACjB,WAAK,GAAG,QAAQ,KAAK,GAAG,YAAY;AAAA,IACrC;AAAA,EACD;AACD;;;ACzzCO,SAAS,mBAAmB,SAAS;AAC3C,MAAI;AACH,QAAI,iBAAiB,OAAO,GAAG;AAC9B,aAAO,IAAI,cAAc,OAAO;AAAA,IACjC;AAAA,EACD,SAAS,GAAG;AACX,YAAQ,IAAI,oCAAoC,EAAE,OAAO;AAAA,EAC1D;AACA,SAAO,IAAI,eAAe,OAAO;AAClC;;;ACNO,SAAS,cAAc,KAAK;AAClC,MAAI,aAAa,IAAI,SAAS;AAC9B,MAAI,eACH,OAAO,IAAI,SAAS,gBAAgB,WACjC,OAAO,IAAI,SAAS,cAAc,MAClC;AACJ,MAAI,eACH,WAAW,SAAS,OAAO,KAAK,IAAI,SAAS,cAAc,aACxD,kBACA;AACJ,MAAI,YAAmB,cAAc,cAAc;AAGnD,UAAQ;AAAA,IACP,aACC,cACA,eACA,QACA,eACA,YACA,oBAEO,mBACP,SACQ,SAAS,SACd,YACO,SAAS,WACf,WACA,aACJ,QACO,qBAAqB,IAC5B,QACO;AAAA,EACT;AAEA,UAAQ;AAAA,IACP,2BAEC,IAAI,SAAS,QACb,MACA,IAAI,SAAS,SACb,WACA,IAAI,SAAS,QACb,MACA,IAAI,SAAS;AAAA,EACf;AACD;;;ACzCA,SAAS,MAAMC,OAAM,GAAG,GAAG;AAC1B,MAAIC,YAAWD,MAAK;AACpB,MAAI,SAASC,UAAS,UAAU;AAChC,MAAI,UAAUA,UAAS,WAAW;AAClC,MAAI,WAAWA,UAAS;AACxB,MAAI,aAAoB;AAExB,MAAI,IAAK,SAAS,QAAQ,OAAO,QAAQ,IAAI;AAC7C,MAAI,IAAK,SAAS,QAAQ,OAAO,SAAS,IAAI;AAG9C,EAAAA,UAAS,WAAW,IAAI,IAAI,YAAY,IAAI,UAAU;AAGtD,SAAO,MAAM,QAAQ,IAAI,aAAa;AACtC,SAAO,MAAM,SAAS,IAAI,aAAa;AAGvC,EAAAA,UAAS,aAAa,SAAS,SAAS,SAAS;AACjD,EAAAA,UAAS,aAAa,SAAS,WAAW,OAAO;AAGjD,EAAAD,MAAK,QAAQ;AACd;AAOO,SAAS,SAASA,OAAM;AAC9B,MAAIC,YAAWD,MAAK;AACpB,MAAI,WAAWC,UAAS;AACxB,MAAI,SAAS,SAAS,OACrB,SAAS,SAAS;AACnB,MAAI;AAEJ,MAAI,SAAS,WAAW;AAEvB,QAAI,iBAAiB;AACrB,QAAI,kBAAkB;AAEtB,QAAI,WAAW,kBAAkB;AAChC,UAAI,QAAQ,WAAW,iBAAiBA,UAAS,UAAU,GAAG,IAAI;AAClE,uBAAiB,SAAS,MAAM,UAAU,EAAE,KAAK;AACjD,wBAAkB,SAAS,MAAM,WAAW,EAAE,KAAK;AAAA,IACpD;AAEA,QAAI,OAAOD,MAAK,SAAS,gBAAgB,aAAa;AAErD,mBAAoB,iBAAiBA,MAAK,SAAS,WAAW;AAAA,IAC/D,OAAO;AAEN,mBAAoB,gBAAgBA,MAAK,iBAAiB,CAAC;AAAA,IAC5D;AAEA,QAAI,aAAa,KAAK,IAAI,gBAAgB,WAAW,KAAK;AAC1D,QAAI,cAAc,KAAK,IAAI,iBAAiB,WAAW,MAAM;AAG7D,QAAI,cAAc,aAAa;AAE/B,QACE,SAAS,gBAAgB,cACzB,cAAcC,UAAS,eACvB,SAAS,gBAAgB,cACzB,cAAcA,UAAS,eACxB,SAAS,gBAAgB,cACxB;AAED,UAAI,SAAS,KAAK,IAAI,gBAAgB,SAAS,SAAS,WAAW;AACnE,eAAS,SAAS,aAAa;AAC/B,MAAAA,UAAS,OAAO,KAAK,MAAM,MAAM,GAAG,SAAS,MAAM;AAAA,IACpD,WACE,SAAS,gBAAgB,cACzB,cAAcA,UAAS,eACvB,SAAS,gBAAgB,cACzB,cAAcA,UAAS,eACxB,SAAS,gBAAgB,eACxB;AAED,UAAI,UAAU,KAAK;AAAA,QAClB;AAAA,QACA,SAAS,SAAS,cAAc;AAAA,MACjC;AACA,eAAS,SAAS,cAAc;AAChC,MAAAA,UAAS,OAAO,SAAS,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,IACpD,WAAW,SAAS,gBAAgB,QAAQ;AAE3C,MAAAA,UAAS,OAAO,KAAK,MAAM,UAAU,GAAG,KAAK,MAAM,WAAW,CAAC;AAAA,IAChE,WAAW,SAAS,gBAAgB,WAAW;AAE9C,eAAS,aAAa,SAAS;AAC/B,eAAS,cAAc,SAAS;AAAA,IACjC,OAAO;AAGN,UAAI,cAAcA,UAAS,aAAa;AACvC,iBAAS,SAAS,aAAa,SAAS;AAAA,MACzC,OAAO;AACN,iBAAS,SAAS,cAAc,SAAS;AAAA,MAC1C;AAAA,IACD;AAAA,EACD;AAEA,QAAMD,OAAM,QAAQ,MAAM;AAC3B;;;AChFA,IAAqB,cAArB,MAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,YAAY,OAAO,QAAQ,SAAS;AAKnC,SAAK,gBAAgB;AAMrB,SAAK,WAAW;AAMhB,SAAK,WAAW;AAOhB,SAAK,QAAQ;AAQb,SAAK,aAAa;AASlB,SAAK,aAAa;AAOlB,SAAK,gBAAgB;AAMrB,SAAK,WAAW;AAUhB,SAAK,cAAc;AAOnB,SAAK,gBAAgB;AAOrB,SAAK,aAAa;AAGlB,SAAK,UAAU;AAGf,SAAK,gBAAgB;AAIrB,SAAK,eAAe;AACpB,SAAK,YAAY;AAGjB,SAAK,cAAc;AACnB,SAAK,iBAAiB;AACtB,SAAK,yBAAyB;AAG9B,SAAK,WAAW,MAAO;AACvB,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAI1B,QAAI,QAAQ,WAAW,MAAM;AAC5B,WAAK,KAAK,OAAO,QAAQ,OAAO;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,OAAO,QAAQ,SAAS;AAC5B,SAAK,WAAW,OAAO,OAAO,4BAA4B,WAAW,CAAC,CAAC;AAGvE,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,SAAS;AACvB,SAAK,SAAS,cAAc,CAAC,CAAC,KAAK,SAAS;AAC5C,SAAK,SAAS,YAAY,CAAC,CAAC,KAAK,SAAS;AAC1C,SAAK,SAAS,+BACb,CAAC,CAAC,KAAK,SAAS;AACjB,SAAK,SAAS,YACb,KAAK,SAAS,cAAc,aAAa,aAAa;AACvD,SAAK,SAAS,WAAW,CAAC,CAAC,KAAK,SAAS;AACzC,SAAK,SAAS,UAAU,CAAC,CAAC,KAAK,SAAS;AACxC,QACC,KAAK,SAAS,YAAY;AAAA,MACzB;AAAA,IACD,MAAM,IACL;AACD,WAAK,SAAS,YAAY,KAAK,SAAS,UAAU,UAAU;AAAA,IAC7D,OAAO;AAEN,WAAK,SAAS,cAAc,aAAa;AACzC,WAAK,SAAS,YAAY,KAAK,SAAS,UAAU,UAAU;AAAA,IAC7D;AAGA,QAAI,cAAc,eAAe;AACjC,QACC,YAAY,UAAU,QACtB,YAAY,WAAW,QACvB,YAAY,WAAW,MACtB;AACD,WAAK,SAAS,WAAW;AACzB,UAAI,YAAY,WAAW,MAAM;AAChC,aAAK,SAAS,eAAe;AAAA,MAC9B;AAAA,IACD,WAAW,YAAY,WAAW,MAAM;AACvC,WAAK,SAAS,WAAW;AAAA,IAC1B;AAGA,SAAK,SAAS,QAAQ,KAAK,SAAS,YACjC,IACA,CAAC,KAAK,SAAS,SAAS;AAG3B,SAAK,SAAS,QAAQ,QAAQ,KAAK,SAAS;AAC5C,SAAK,SAAS,QAAQ,SAAS,KAAK,SAAS;AAG7C,SAAK,gBAAuB,WAAW,KAAK,SAAS,MAAM;AAC3D,QAAI,OAAO,KAAK,SAAS,gBAAgB,aAAa;AACrD,WAAK,SAAS,cAAqB,WAAW,KAAK,SAAS,WAAW;AAAA,IACxE;AAEA,QAAI,OAAO,KAAK,SAAS,aAAa,UAAU;AAC/C,cAAQ,KAAK,SAAS,UAAU;AAAA,QAC/B,KAAK;AAAA,QACL,KAAK;AACJ,eAAK,WAAW,mBAAmB,KAAK,QAAQ;AAChD;AAAA,QACD;AACC,eAAK,WAAW,IAAI,eAAe,KAAK,QAAQ;AAChD;AAAA,MACF;AAAA,IACD,OAAO;AACN,UAAI,iBAAiB,KAAK,SAAS;AAEnC,WAAK,WAAW,IAAI,eAAe,KAAK,QAAQ;AAAA,IACjD;AAGA,iBAAa,YAAY,iBAAiB,MAAM;AAC/C,aAAO,SAAS,IAAI;AAAA,IACrB,CAAC;AACD,iBAAa,YAAY,6BAA6B,MAAM;AAC3D,aAAO,SAAS,IAAI;AAAA,IACrB,CAAC;AAGD,SAAK,cAAc,YAAY,KAAK,SAAS,UAAU,CAAC;AAGxD,QAAW,SAAS,UAAU;AAE7B,MAAO,YAAY,KAAK;AAAA,IACzB;AAGA,aAAS,IAAI;AAGb,QAAI,sBAAsB,YAAY;AAErC,UAAI,WAAW,IAAI,iBAAiB,MAAM;AACzC,eAAO,SAAS,IAAI;AAAA,MACrB,CAAC;AAGD,eAAS,QAAQ,KAAK,eAAe;AAAA,QACpC,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS;AAAA,MACV,CAAC;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,kBAAkB,OAAO;AAC1C,oBAAc,IAAI;AAAA,IACnB;AAGA,SAAK,QAAQ,IAAI,MAAM,GAAG,GAAG,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM;AAGtE,SAAK,MAAM,MAAM;AAEjB,SAAK,MAAM,SAAS,KAAK,SAAS;AAGlC,SAAK,aAAa,WAAW,YAAY,IAAI;AAE7C,SAAK,MAAM,WAAW,EACrB,KAAK,SAAS,SAAS,WAAW,KAAK,SAAS,cAAc;AAG/D,SAAK,gBAAgB;AAErB,iBAAa,KAAK,SAAS;AAC3B,iBAAa,YAAY,cAAc,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC9D,iBAAa,YAAY,eAAe,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC/D,iBAAa,YAAY,cAAc,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC9D,iBAAa,YAAY,aAAa,KAAK,MAAM,KAAK,IAAI,CAAC;AAC3D,iBAAa,YAAY,MAAM,CAAC,SAAS;AACxC,WAAK,OAAO,IAAI;AAChB,WAAK,KAAK;AAAA,IACX,CAAC;AAED,iBAAa,YAAY,MAAM,MAAM;AACpC,UAAI,KAAK,eAAe,MAAM;AAC7B,sBAAM,KAAK,IAAI;AAAA,MAChB;AACA,UAAI,KAAK,gBAAgB,MAAM;AAC9B,sBAAM,MAAM,IAAI;AAAA,MACjB;AAAA,IACD,CAAC;AAED,iBAAa,YAAY,OAAO,MAAM;AACrC,UAAI,KAAK,eAAe,MAAM;AAC7B,sBAAM,QAAQ,IAAI;AAAA,MACnB;AACA,UAAI,KAAK,kBAAkB,MAAM;AAChC,sBAAM,OAAO,IAAI;AAAA,MAClB;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAEP,QAAI,UAAU,cAAM,IAAI;AACxB,QAAI,OAAO,YAAY,aAAa;AACnC,WAAK,WAAW,QAAQ,QAAQ,IAAI,SAAS;AAAA,IAC9C;AAGA,iBAAa,KAAK,UAAU;AAG5B,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAS;AACZ,WAAO,KAAK,MAAM;AAAA,EACnB;AAAA,EACA,IAAI,OAAO,OAAO;AACjB,SAAK,MAAM,SAAS;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,kBAAkB;AAEjB,SAAK,eAAe;AACpB,SAAK,YAAY,CAAC,EAAE,MAAM,KAAK,cAAM;AAGrC,SAAK,WAAW,MAAO,KAAK,MAAM;AAClC,SAAK,cAAc;AACnB,SAAK,iBAAiB,KAAK,WAAW;AAItC,SAAK,gBAAgB,cAAM,SAAS,KAAK,MAAM;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB;AAClB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACT,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,MAAM;AAEZ,QAAI,EAAE,KAAK,eAAe,KAAK,cAAc,GAAG;AAE/C,WAAK,eAAe;AAGpB,mBAAa,KAAK,oBAAoB,IAAI;AAC1C,WAAK,eAAe,cAAM,SAAS;AACnC,WAAK,cAAc,KAAK,IAAI,KAAK,aAAa,KAAK,cAAc;AAEjE,WAAK,cAAc,cAAM,gBAAgB,cAAM,SAAS,IAAI,KAAK;AACjE,WAAK,yBAAyB,cAAM,gBACjC,KAAK,cACL,KAAK,IAAI,KAAK,aAAa,KAAK,kBAAkB;AAErD,aACC,KAAK,eAAe,KAAK,0BACzB,cAAM,eACL;AACD,aAAK,kBAAkB,WAAW,YAAY,IAAI;AAGlD,YAAI,cAAM,SAAS,MAAM,MAAM;AAC9B,uBAAa,KAAK,aAAa,IAAI;AAAA,QACpC;AAGA,aAAK,UAAU,KAAK,MAAM,OAAO,KAAK,WAAW;AACjD,aAAK,UAAU,cAAM,QAAQ,EAAE,OAAO,KAAK,WAAW,KAAK,KAAK;AAEhE,aAAK,aAAa,WAAW,YAAY,IAAI;AAC7C,aAAK,qBAAqB,KAAK,aAAa,KAAK;AAEjD,aAAK,eAAe,KAAK;AACzB,YAAI,cAAM,eAAe;AACxB,eAAK,cAAc;AACnB;AAAA,QACD;AAAA,MACD;AAGA,mBAAa,KAAK,mBAAmB,KAAK,UAAU;AAAA,IACrD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACN,QACC,KAAK,SAAS,mBAAmB,SAChC,KAAK,WAAW,KAAK,gBACrB;AAED,mBAAa,KAAK,kBAAkB,WAAW,YAAY,IAAI,CAAC;AAGhE,WAAK,SAAS,MAAM;AAGpB,oBAAM,QAAQ,EAAE,KAAK,KAAK,UAAU,KAAK,KAAK;AAG9C,WAAK,UAAU;AAGf,WAAK,SAAS,MAAM;AAGpB,mBAAa,KAAK,iBAAiB,WAAW,YAAY,IAAI,CAAC;AAAA,IAChE;AAAA,EACD;AACD;;;ACxcA,IAAqB,WAArB,cAAsC,WAAW;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAA0B;AAErC;AAAA,MACC,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,SAAS,MAAM;AAAA,MACvB,QAAQ,SAAS,MAAM;AAAA,IACxB;AAEA,SAAK,MAAM,aAAa,IAAI;AAC5B,SAAK,aAAa,SAAS,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA0B,cAAuB,OAAO;AACpE,QAAI,CAAC,aAAa;AACjB,WAAK,IAAI,IAAI,QAAQ,gBAAgB,GAAG,QAAQ,gBAAgB,CAAC;AACjE,WAAK,OAAO,QAAQ,SAAS,MAAM,OAAO,QAAQ,SAAS,MAAM,MAAM;AACvE,WAAK,iBAAiB,SAAS;AAAA,IAChC;AAEA,SAAK,QAAQ,QAAQ,SAAS;AAG9B,SAAK,eAAe;AAEpB,QAAI,OAAO,QAAQ,SAAS,SAAS,UAAU;AAC9C,WAAK,KAAK,SAAS,QAAQ,SAAS,IAAW;AAAA,IAChD;AAEA,SAAK,YAAY,QAAQ,SAAS,kBAAkB,aAAa;AAEjE,QAAI,QAAQ,SAAS,cAAc,UAAU;AAC5C,WAAK,YAAY,QAAQ,SAAS;AAAA,IACnC;AAGA,UAAM,QACL,QAAQ,SAAS,SAChB,QAAQ,SAAS,iBAAiB,KAC/B,YAAY,GAAG,CAAC,IAAI,KAAK,QAAQ,SAAS,iBAC3C;AACJ,UAAM,QACL,QAAQ,SAAS,SAChB,QAAQ,SAAS,iBAAiB,KAC/B,YAAY,GAAG,CAAC,IAAI,KAAK,QAAQ,SAAS,iBAC3C;AAGJ,SAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,GAAG,CAAC,QAAQ,KAAK,IAAI,KAAK,CAAC;AAG9D,SAAK,OAAO,YAAY,QAAQ,SAAS,SAAS,QAAQ,SAAS,OAAO;AAC1E,SAAK,YAAY,KAAK;AAItB,SAAK,aAAa;AAAA,MACjB;AAAA,QACC,QAAQ,SAAS;AAAA,QACjB,QAAQ,SAAS;AAAA,MAClB;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,IAClB;AACA,SAAK,WAAW;AAAA,MACf,YAAY,QAAQ,SAAS,aAAa,QAAQ,SAAS,WAAW;AAAA,MACtE,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,IAClB;AAGA,SAAK,UAAU,QAAQ,SAAS;AAChC,SAAK,OAAO,QAAQ,SAAS;AAG7B,SAAK,mBAAmB,QAAQ,SAAS;AAGzC,SAAK,iBAAiB,QAAQ,SAAS;AAGvC,SAAK,YAAY,cAAM,SAAS;AAIhC,QAAI,CAAC,QAAQ,SAAS,kBAAkB;AACvC,WAAK,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,QAAQ,SAAS;AAAA,MAClB;AAAA,IACD;AAEA,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQS,OAAO,IAAY;AAE3B,UAAM,OAAO,KAAK,KAAK;AAGvB,SAAK,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK;AAE9C,QAAI,KAAK,SAAS,KAAK,QAAQ,GAAG;AACjC,YAAM,SAAS,KAAK;AAEpB,aAAO,YAAY,MAAM,IAAI;AAC7B,mBAAa,QAAQ,IAAI;AACzB,WAAK,QAAQ;AACb,aAAO;AAAA,IACR;AAGA,UAAM,WAAW,KAAK,OAAO,KAAK;AAGlC,QAAIE,SAAQ,KAAK;AACjB,QAAI,KAAK,aAAa,KAAK,UAAU;AACpC,MAAAA,UAAS;AACT,MAAAA,SAAQA,SAAQ,KAAK,WAAW,KAAK,WAAWA;AAAA,IACjD,WAAW,KAAK,aAAa,KAAK,UAAU;AAC3C,MAAAA,UAAS;AACT,MAAAA,SAAQA,SAAQ,KAAK,WAAW,KAAK,WAAWA;AAAA,IACjD;AAGA,SAAK,QAAQ;AAGb,SAAK,IAAI,KAAK,KAAK,OAAO;AAC1B,SAAK,IAAI,KAAK,KAAK,UAAU;AAG7B,UAAM,QAAQ,KAAK,mBAChB,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,IACjC,KAAK;AAER,SAAK,IAAI,KAAK,KAAK,IAAI,IAAI;AAC3B,SAAK,IAAI,KAAK,KAAK,IAAI,IAAI;AAG3B,SAAK,iBACH,aAAaA,QAAO,GAAG,GAAG,GAAGA,QAAO,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,EAChE,OAAO,KAAK;AAGd,SAAK,UAAU,KAAK,cAAc,CAAC,KAAK;AAExC,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKS,KAAKC,WAA0C;AACvD,UAAM,IAAI,KAAK;AACf,UAAM,IAAI,KAAK;AACf,IAAAA,UAAS,UAAU,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;AAAA,EAChE;AACD;AAEO,IAAM,eAAe;AAAA,EAC3B,CAAC,YAAY;AACZ,UAAM,WAAW,IAAI,SAAS,OAAO;AAErC,WAAO;AAAA,MACN;AAAA,MACA,MAAMC,UAAS;AACd,iBAAS,aAAaA,UAAS,KAAK;AAAA,MACrC;AAAA,IACD;AAAA,EACD;AACD;AAEA,aAAa,YAAY,YAAY;;;ACpNrC,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAON,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,OAAO,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASN,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,cAAc;AACf;AAEA,IAAO,mBAAQ;;;ACtNf,SAAS,6BAA6B,IAAI,GAAG,IAAI,GAAG;AACnD,QAAM,yBAAyB,IAAI,2BAAmB,GAAG,GAAG;AAAA,IAC3D,iBAAiB;AAAA,EAClB,CAAC;AAED,yBAAuB,QAAQ,YAAY;AAC3C,yBAAuB,QAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAElD,SAAO;AACR;AAKA,IAAqB,kBAArB,cAA6C,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BtD,YAAY,GAAG,GAAG,WAAW,CAAC,GAAG;AAEhC,UAAM,GAAG,GAAG,SAAS,QAAQ,GAAG,SAAS,SAAS,CAAC;AAMnD,SAAK,WAAW,CAAC;AAGjB,SAAK,SAAS,GAAG,CAAC;AAIlB,SAAK,UAAU;AAKf,SAAK,kBAAkB;AAKvB,SAAK,iBAAiB;AAItB,SAAK,WAAW;AAGhB,SAAK,eAAe;AAGpB,SAAK,WAAW;AAGhB,SAAK,eAAe;AAGpB,SAAK,MAAM;AAKX,SAAK,MAAM,QAAQ;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,CAAC,GAAG;AACpB,WAAO,OAAO,KAAK,UAAU,kBAAyB,QAAQ;AAE9D,QAAI,OAAO,KAAK,SAAS,UAAU,aAAa;AAC/C,WAAK,mBAAmB;AAAA,QACvB,SAAS;AAAA,QACT,SAAS;AAAA,MACV;AACA,WAAK,SAAS,QAAQ,KAAK,iBAAiB;AAAA,IAC7C;AAEA,SAAK,WAAW,KAAK,SAAS;AAE9B,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AACjB,WAAO,YAAY,GAAG,KAAK,UAAU,EAAE,KAAK;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AACjB,WAAO,YAAY,GAAG,KAAK,UAAU,EAAE,MAAM;AAAA,EAC9C;AAAA;AAAA;AAAA,EAIA,aAAa,OAAO;AACnB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAE/B,WAAK,SAAS,aAAa,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,IACjD;AACA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,YAAY,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,UAAU;AACzB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS,YAAY,KAAK,IAAI,GAAG,KAAK,SAAS,SAAS;AAC7D,SAAK,iBACJ,OAAO,aAAa,WAAW,WAAW,KAAK,SAAS;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACZ,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAO;AACrB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK;AAAA,MACJ,OAAO,UAAU,WAAW,QAAQ,KAAK,SAAS;AAAA,IACnD;AACA,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAI;AAEV,QAAI,EAAE,KAAK,eAAe,KAAK,SAAS,cAAc;AACrD,WAAK,eAAe;AAAA,IACrB;AACA,QAAI,KAAK,eAAe,GAAG;AAC1B,WAAK,OAAO;AACZ,aAAO,KAAK;AAAA,IACb;AAGA,UAAM,KAAK;AACX,SAAK,MAAM;AAGX,SAAK,WAAW,MAAM,OAAO,EAAE;AAG/B,QAAI,KAAK,YAAY,KAAK,SAAS;AAElC,UAAI,KAAK,mBAAmB,UAAU;AACrC,aAAK,kBAAkB;AAEvB,YAAI,KAAK,kBAAkB,GAAG;AAC7B,eAAK,WAAW;AAChB,iBAAO,KAAK;AAAA,QACb;AAAA,MACD;AAGA,WAAK,mBAAmB;AAGxB,YAAM,iBAAiB,KAAK,SAAS;AACrC,UACC,iBAAiB,KAAK,SAAS,kBAC/B,KAAK,mBAAmB,KAAK,SAAS,WACrC;AACD,YACC,iBAAiB,KAAK,SAAS,gBAC/B,KAAK,SAAS,gBACb;AACD,eAAK,aAAa,KAAK,SAAS,YAAY;AAAA,QAC7C,OAAO;AACN,eAAK,aAAa,KAAK,SAAS,iBAAiB,cAAc;AAAA,QAChE;AACA,aAAK,kBAAkB;AACvB,aAAK,UAAU;AAAA,MAChB;AAAA,IACD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,UAAM,QAAQ,SAAS;AAEvB,QAAI,OAAO,KAAK,qBAAqB,aAAa;AACjD,WAAK,iBAAiB,QAAQ;AAC9B,WAAK,mBAAmB;AAAA,IACzB;AACA,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW;AAAA,EACjB;AACD;;;ACpQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,UAAU;;;ADWhB,IAAM,QAAQ,CAAC;AAWf,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA,EAIvB,YAAY,MAAM,MAAM;AAKvB,SAAK,UAAU;AAMf,SAAK,MAAM;AAAA,EACZ;AACD;AAkBO,SAAS,MAAM,OAAO,MAAM,IAAI;AAEtC,MAAI,OAAO,MAAM,cAAc,aAAa;AAC3C,YAAQ,MAAM;AAAA,EACf;AAEA,MAAI,OAAO,MAAM,IAAI,MAAM,YAAY;AAEtC,UAAM,UAAU,MAAM,IAAI;AAE1B,WAAO,eAAe,OAAO,MAAM;AAAA,MAClC,cAAc;AAAA,MACd,OAAQ,0BAAUC,OAAMC,KAAI;AAC3B,eAAO,WAAY;AAClB,eAAK,WAAW;AAChB,gBAAM,MAAMA,IAAG,MAAM,MAAM,SAAS;AACpC,eAAK,WAAW;AAChB,iBAAO;AAAA,QACR;AAAA,MACD,GAAG,MAAM,EAAE;AAAA,IACZ,CAAC;AAAA,EACF,OAAO;AACN,UAAM,IAAI,MAAM,OAAO,8BAA8B;AAAA,EACtD;AACD;AAeO,SAAS,SAAS,QAAQ,OAAO,OAAO,SAAS,EAAE,MAAM,QAAQ,EAAE,CAAC,GAAG;AAE7E,MAAI,MAAM,IAAI,GAAG;AAChB,UAAM,IAAI,MAAM,YAAY,OAAO,qBAAqB;AAAA,EACzD;AAGA,MAAI,QAAQ,CAAC;AACb,MAAI,UAAU,SAAS,GAAG;AAEzB,YAAQ,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC;AAAA,EAChD;AAGA,QAAM,CAAC,IAAI;AACX,QAAM,WAAW,KAAK,OAAO,KAAK,MAAM,QAAQ,KAAK,GAAG;AAGxD,MAAI,OAAO,aAAa,eAAe,EAAE,oBAAoB,aAAa;AACzE,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC9D;AAGA,MAAI,aAAa,SAAS,SAAS,OAAO,IAAI,GAAG;AAChD,UAAM,IAAI;AAAA,MACT,wCACC,SAAS,UACT,YACA;AAAA,IACF;AAAA,EACD;AAGA,QAAM,IAAI,IAAI;AACf;AASO,SAAS,IAAI,WAAW;AAC9B,aAAW,QAAQ,OAAO;AACzB,QACE,OAAO,cAAc,YAAY,cAAc,QAChD,MAAM,IAAI,aAAa,WACtB;AACD,aAAO,MAAM,IAAI;AAAA,IAClB;AAAA,EACD;AACD;;;AE9IA,IAAqB,cAArB,cAAyC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,QAAQ;AAEpB,SAAK,OAAO,SAAS;AACrB,SAAK,OAAO,SAAS;AACrB,SAAK,KAAK,SAAS;AAGnB,QAAI,QAAQ,SAAS;AACrB,QAAI,OAAO,UAAU,aAAa;AACjC,cAAQ,YAAY,IAAI,GAAG,GAAG;AAAA,QAC7B,aAAa,IAAI,GAAG,CAAC;AAAA,QACrB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,QAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,MACzC,CAAC;AAAA,IACF;AACA,SAAK,OAAO,IAAI,KAAK,MAAM,KAAK;AAChC,SAAK,KAAK,gBAAgB,UAAU,MAAM;AAE1C,SAAK,KAAK,iBAAiB,UAAU,MAAM,aAAa;AACxD,SAAK,KAAK,UAAU,IAAI;AAGxB,QAAI,SAAS,aAAa;AACzB,WAAK,YAAY,IAAI,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,IACpE,OAAO;AAEN,WAAK,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1B;AAAA,EACD;AACD;;;AChCA,IAAqB,aAArB,cAAwC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlD,YAAY,MAAM,OAAO,GAAG;AAE3B,UAAM,GAAG,GAAG,UAAU,QAAQ;AAM9B,SAAK,QAAQ,UAAU,IAAI,EAAE,SAAS,KAAK;AAE3C,SAAK,aAAa,MAAM,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,aAAa,MAAM,OAAO,IAAI,GAAG;AAEhC,SAAK,OAAO;AACZ,SAAK,IAAI,IAAI;AACb,SAAK,WAAW;AAEhB,SAAK,MAAM,SAAS,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKC,WAAU,UAAU;AACxB,IAAAA,UAAS,KAAK;AACd,IAAAA,UAAS,SAAS,GAAG,GAAG,SAAS,OAAO,SAAS,MAAM;AACvD,IAAAA,UAAS,WAAW,KAAK,KAAK;AAC9B,IAAAA,UAAS,QAAQ;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,cAAU,QAAQ,KAAK,KAAK;AAC5B,SAAK,QAAQ;AACb,UAAM,QAAQ;AAAA,EACf;AACD;;;ACjDO,IAAM,YAAN,cAAwB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzC,YAAY,GAAG,GAAG,OAAO,QAAQ;AAChC,UAAM,GAAG,GAAG,OAAO,MAAM;AACzB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,aAAa,IAAI,SAAS,GAAG,CAAC;AACnC,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa;AACZ,IAAM,qBAAqB,eAAe,MAAM,CAAC,MAAM;AACtD,mBAAa,KAAK,WAAW,GAAG,IAAI;AAAA,IACrC,CAAC;AACD,IAAM,qBAAqB,aAAa,MAAM,CAAC,MAAM;AACpD,mBAAa,KAAK,SAAS,GAAG,IAAI;AAAA,IACnC,CAAC;AACD,IAAM,qBAAqB,iBAAiB,MAAM,CAAC,MAAM;AACxD,mBAAa,KAAK,SAAS,GAAG,IAAI;AAAA,IACnC,CAAC;AAED,SAAK,oBAAoB,CAAC,MAAM;AAC/B,WAAK,SAAS,CAAC;AAAA,IAChB;AAEA,SAAK,kBAAkB,CAAC,GAAG,cAAc;AACxC,UAAI,cAAc,MAAM;AACvB,aAAK,UAAU,CAAC;AAAA,MACjB;AAAA,IACD;AAEA,SAAK,gBAAgB,CAAC,GAAG,cAAc;AACtC,UAAI,cAAc,MAAM;AACvB,aAAK,QAAQ,CAAC;AAAA,MACf;AAAA,IACD;AAEA,iBAAa,YAAY,aAAa,KAAK,iBAAiB;AAC5D,iBAAa,YAAY,WAAW,KAAK,eAAe;AACxD,iBAAa,YAAY,SAAS,KAAK,aAAa;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAG;AACZ,QAAI,KAAK,aAAa,OAAO;AAC5B,WAAK,WAAW;AAChB,WAAK,WAAW,IAAI,EAAE,OAAO,EAAE,KAAK;AACpC,WAAK,WAAW,IAAI,KAAK,GAAG;AAC5B,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,GAAG;AACX,QAAI,KAAK,aAAa,MAAM;AAC3B,WAAK,IAAI,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AACzC,WAAK,IAAI,IAAI,KAAK,UAAU;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,QAAI,KAAK,aAAa,MAAM;AAC3B,WAAK,WAAW;AAChB,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,iBAAa,eAAe,aAAa,KAAK,iBAAiB;AAC/D,iBAAa,eAAe,WAAW,KAAK,eAAe;AAC3D,iBAAa,eAAe,SAAS,KAAK,aAAa;AACvD,IAAM,oBAAoB,eAAe,IAAI;AAC7C,IAAM,oBAAoB,aAAa,IAAI;AAC3C,IAAM,oBAAoB,iBAAiB,IAAI;AAC/C,UAAM,QAAQ;AAAA,EACf;AACD;;;AC3GO,IAAM,aAAN,cAAyB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C,YAAY,GAAG,GAAG,OAAO,QAAQ;AAChC,UAAM,GAAG,GAAG,OAAO,MAAM;AAEzB,SAAK,cAAc;AAQnB,SAAK,sBAAsB;AAQ3B,SAAK,uBAAuB;AAS5B,SAAK,cAAc,KAAK;AAExB,SAAK,wBAAwB,aAAa;AAAA,MACzC;AAAA,MACA,KAAK,UAAU,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,aAAa;AAG3B,QAAI,OAAO,KAAK,UAAU,EAAE,KAAK,WAAW,MAAM,YAAY;AAC7D,WAAK,cAAc;AAAA,IACpB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,GAAG,WAAW;AACvB,QACC,aACA,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,UAAU,UAAU,CAAC,GACvD;AAED,WAAK,KAAK,SAAS;AAAA,IACpB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,UAAU;AACT,SAAK,sBAAsB;AAC3B,UAAM,QAAQ;AAAA,EACf;AACD;;;AC7EA,IAAqB,SAArB,cAAoC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB9C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,SAAS,OAAO,SAAS,MAAM;AAM3C,SAAK,WAAW,CAAC;AAEjB,QAAI,SAAS,OAAO;AAEnB,eAAS,aAAa,SAAS,cAAc,SAAS;AACtD,eAAS,cAAc,SAAS,eAAe,SAAS;AACxD,WAAK,aAAa,IAAI,OAAO,GAAG,GAAG,QAAQ;AAAA,IAC5C;AAGA,QAAI,SAAS,aAAa;AACzB,WAAK,YAAY,SAAS,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,IACzE,OAAO;AAEN,WAAK,YAAY,SAAS,GAAG,CAAC;AAAA,IAC/B;AAGA,QAAI,OAAO,SAAS,SAAS,UAAU;AACtC,WAAK,OAAO,SAAS;AAAA,IACtB;AAMA,SAAK,OAAO,SAAS,QAAQ;AAM7B,SAAK,KAAK,SAAS,MAAM;AAOzB,SAAK,QAAQ;AAGb,QAAI,OAAO,SAAS,WAAW,aAAa;AAC3C,eAAS,SAAS,YAAY,IAAI,GAAG,GAAG;AAAA,QACvC,aAAa,IAAI,GAAG,CAAC;AAAA,QACrB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,QAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,QACxC,aAAa,IAAI,GAAG,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACF;AAMA,SAAK,OAAO,IAAI,KAAK,MAAM,SAAS,QAAQ,MAAM;AACjD,aAAO,KAAK,aAAa;AAAA,IAC1B,CAAC;AAGD,QAAI,KAAK,UAAU,KAAK,KAAK,WAAW,GAAG;AAC1C,WAAK,OAAO,KAAK,KAAK,UAAU,EAAE,OAAO,KAAK,KAAK,UAAU,EAAE,MAAM;AAAA,IACtE;AAGA,SAAK,KAAK,iBAAiB,SAAS,aAAa;AACjD,SAAK,KAAK,iBAAiB,SAAS,aAAa;AAGjD,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAa;AAChB,WAAO,KAAK,SAAS,CAAC;AAAA,EACvB;AAAA,EAEA,IAAI,WAAW,OAAO;AACrB,QAAI,iBAAiB,YAAY;AAChC,WAAK,SAAS,CAAC,IAAI;AACnB,WAAK,SAAS,CAAC,EAAE,WAAW;AAC5B,WAAK,aAAa;AAAA,IACnB,OAAO;AACN,YAAM,IAAI,MAAM,QAAQ,6BAA6B;AAAA,IACtD;AAAA,EACD;AAAA;AAAA,EAGA,OAAO,IAAI;AACV,QAAI,KAAK,YAAY;AACpB,WAAK,WAAW,KAAK,WAAW,OAAO,EAAE;AAAA,IAC1C;AACA,WAAO,MAAM,OAAO,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAAW,MAAM;AAC7B,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO,MAAM;AACb,WAAO,SAAS,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAG7C,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC9C,aAAO,UAAU,KAAK,SAAS,CAAC,EAAE,UAAU,CAAC;AAAA,IAC9C;AAEA,QAAI,KAAK,MAAM;AACd,aAAO,UAAU,KAAK,KAAK,UAAU,CAAC;AAAA,IACvC;AAEA,QAAI,aAAa,MAAM;AACtB,YAAM,SAAS,KAAK,oBAAoB;AACxC,aAAO;AAAA,QACN,OAAO,IAAI,OAAO,IAAI,OAAO,QAAQ;AAAA,QACrC,OAAO,IAAI,OAAO,IAAI,OAAO,SAAS;AAAA,MACvC;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACd,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,QAAQC,WAAU;AACjB,IAAAA,UAAS,KAAK;AAGd,IAAAA,UAAS;AAAA,MACR,KAAK,IAAI,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,MACnC,KAAK,IAAI,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,IACpC;AAEA,QAAI,KAAK,sBAAsB,YAAY;AAI1C,MAAAA,UAAS;AAAA,QACR,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,QAC3C,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,MAC5C;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKA,WAAU,UAAU;AACxB,UAAM,aAAa,KAAK;AACxB,QAAI,sBAAsB,YAAY;AAErC,iBAAW,QAAQA,SAAQ;AAG3B,iBAAW,KAAKA,WAAU,QAAQ;AAGlC,iBAAW,SAASA,SAAQ;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,QAAI,KAAK,YAAY;AACpB,WAAK,WAAW,QAAQ,MAAM,KAAK,YAAY,SAAS;AACxD,WAAK,SAAS,OAAO,GAAG,CAAC;AAAA,IAC1B;AAGA,UAAM,QAAQ,SAAS;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB;AACnB,QAAI,KAAK,cAAc,KAAK,WAAW,mBAAmB;AACzD,WAAK,WAAW,kBAAkB;AAAA,IACnC;AAAA,EACD;AACD;;;AC/NA,IAAqB,aAArB,cAAwC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB9C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,QAAQ;AAGpB,SAAK,WAAW;AAGhB,SAAK,OAAO,IAAI,GAAG,CAAC;AAYpB,SAAK,QAAQ,aAAa,IAAI,GAAK,CAAG;AAEtC,QAAI,OAAO,SAAS,UAAU,aAAa;AAE1C,UAAe,UAAU,SAAS,KAAK,GAAG;AACzC,aAAK,MAAM,IAAI,SAAS,OAAO,CAAC,SAAS,KAAK;AAAA,MAC/C,OAAoB;AACnB,aAAK,MAAM,KAAK,SAAS,KAAK;AAAA,MAC/B;AAAA,IACD;AAEA,QAAI,OAAO,SAAS,gBAAgB,aAAa;AAChD,WAAK,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1B,OAAO;AACN,UAAI,OAAO,SAAS,gBAAgB,UAAU;AAC7C,aAAK,YAAY,IAAI,SAAS,aAAa,SAAS,WAAW;AAAA,MAChE,OAAoB;AACnB,aAAK,YAAY,IAAI,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,MACpE;AAAA,IACD;AAEA,SAAK,SAAS,SAAS,UAAU;AAGjC,SAAK,qBAAqB,KAAK,cAAc,KAAK,IAAI;AACtD,iBAAa,YAAY,oBAAoB,KAAK,kBAAkB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAI,SAAS;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,OAAO,OAAO;AACjB,SAAK,UAAU;AACf,YAAQ,KAAK,SAAS;AAAA,MACrB,KAAK;AACJ,aAAK,UAAU;AACf,aAAK,UAAU;AACf;AAAA,MACD,KAAK;AACJ,aAAK,UAAU;AACf,aAAK,UAAU;AACf;AAAA,MACD,KAAK;AACJ,aAAK,UAAU;AACf,aAAK,UAAU;AACf;AAAA,MACD;AACC,aAAK,UAAU;AACf,aAAK,UAAU;AACf;AAAA,IACF;AACA,SAAK,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM;AACrD,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA,EAGA,kBAAkB;AACjB,SAAK,mBAAmB,KAAK,YAAY,KAAK,IAAI;AAClD,SAAK,cAAc,KAAK,OAAO,KAAK,IAAI;AAExC,iBAAa,YAAY,mBAAmB,KAAK,gBAAgB;AACjE,iBAAa,YAAY,mBAAmB,KAAK,WAAW;AAE5D,iBAAa,YAAY,cAAc,KAAK,gBAAgB;AAI5D,QAAI,KAAK,SAAS,SAAS,MAAM;AAChC,WAAK,YAAY;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAG,GAAG;AACZ,WAAO,MAAM;AAAA,MACZ,KAAK,UAAU,WAAW;AAAA,MAC1B,KAAK,UAAU,WAAW;AAAA,IAC3B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB;AACf,SAAK,WAAW,SAAS,cAAc,KAAK,OAAO,KAAK,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,UAAM,KAAK,KAAK,MAAM;AACtB,UAAM,KAAK,KAAK,MAAM;AAEtB,UAAM,WAAW,KAAK;AAEtB,QAAI,OAAO,KAAK,OAAO,GAAG;AAEzB;AAAA,IACD;AAEA,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,KAAK;AACpB,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,KAAK,KAAK,YAAY;AAC5B,UAAM,KAAK,KAAK,YAAY;AAO5B,UAAM,IACL,MAAM,KAAK,MAAM,KAAK,SAAS,SAC/B,KAAK,OAAO,IACZ,KAAK,SAAS,IAAI;AACnB,UAAM,IACL,MAAM,KAAK,MAAM,KAAK,SAAS,UAC/B,KAAK,OAAO,IACZ,KAAK,SAAS,IAAI;AAGnB,QAAI,KAAK,SAAS;AACjB,WAAK,IAAI,IAAI,IAAI;AAAA,IAClB,OAAO;AACN,WAAK,IAAI,IAAI;AAAA,IACd;AAGA,QAAI,KAAK,SAAS;AACjB,WAAK,IAAI,IAAI,IAAI;AAAA,IAClB,OAAO;AACN,WAAK,IAAI,IAAI;AAAA,IACd;AAEA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQC,WAAU;AAEjB,IAAAA,UAAS,KAAK;AAGd,IAAAA,UAAS,eAAeA,UAAS,YAAY,IAAI,KAAK,WAAW,CAAC;AAGlE,IAAAA,UAAS,QAAQ,KAAK,IAAI;AAG1B,QAAI,KAAK,cAAcA,UAAS,aAAa,GAAG;AAC/C,MAAAA,UAAS,aAAa,KAAK,SAAS;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAKA,WAAU,UAAU;AACxB,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,KAAK;AACpB,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,KAAK,KAAK,YAAY;AAC5B,UAAM,KAAK,KAAK,YAAY;AAE5B,QAAI,IAAI,KAAK,IAAI;AACjB,QAAI,IAAI,KAAK,IAAI;AAEjB,QAAI,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG;AAE7C,UAAI,IAAI,MAAM,KAAK;AACnB,UAAI,IAAI,MAAM,KAAK;AAAA,IACpB;AAEA,IAAAA,UAAS,UAAU,GAAG,CAAC;AACvB,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,SAAS,SAAS;AAAA,IACnB;AAAA,EACD;AAAA;AAAA,EAGA,oBAAoB;AAEnB,iBAAa,eAAe,mBAAmB,KAAK,gBAAgB;AACpE,iBAAa,eAAe,mBAAmB,KAAK,WAAW;AAC/D,iBAAa,eAAe,cAAc,KAAK,gBAAgB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,iBAAa,QAAQ,KAAK,KAAK;AAC/B,SAAK,QAAQ;AACb,iBAAa,eAAe,oBAAoB,KAAK,kBAAkB;AACvE,UAAM,QAAQ;AAAA,EACf;AACD;;;ACjRA,SAAS,eAAe,OAAO;AAC9B,QAAM,UAAU,MAAM,QAAQ;AAE9B,QAAM,KAAK,MAAM,QAAQ,QAAQ;AACjC,QAAM,KAAK,MAAM,QAAQ,SAAS;AAElC,QAAM,UAAU,MAAM;AACtB,QAAM,UAAU,MAAM;AAEtB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,QAAQ,MAAM;AAEpB,MAAI,WAAW,SAAS;AACvB,aAAS;AACT,gBAAY;AACZ,aAAS,UAAU;AACnB,gBAAY,UAAU;AACtB,eAAW,QAAQ;AAAA,MAClB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACD;AAAA,EACD,OAAO;AACN,aAAS;AACT,gBAAY;AACZ,aAAS,UAAU;AACnB,gBAAY,UAAU;AACtB,eAAW,QAAQ;AAAA,MAClB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,WAAS,aAAa,GAAG,MAAM,MAAM,OAAO,MAAM,SAAS,CAAC;AAC5D,WAAS,aAAa,GAAG,MAAM,MAAM,OAAO,CAAG,CAAC;AAEhD,UAAQ,YAAY;AAEpB,UAAQ,aAAa,QAAQ,GAAG,GAAG,QAAQ,GAAG,CAAC;AAC/C,UAAQ;AAAA,IACP;AAAA,IACA;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,QAAQ,SAAS;AAAA,EACxB;AACD;AASA,IAAqB,UAArB,cAAqC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/C,YACC,GACA,GACA,SACA,UAAU,SACV,QAAQ,QACR,YAAY,KACX;AAED,UAAM,GAAG,GAAG,UAAU,GAAG,UAAU,CAAC;AAOpC,SAAK,QAAQ,UAAU,IAAI,EAAE,SAAS,KAAK;AAM3C,SAAK,UAAU;AAMf,SAAK,UAAU;AAOf,SAAK,YAAY;AASjB,SAAK,YAAY;AAGjB,SAAK,cAAc,YAAY;AAAA,MAC9B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAGA,SAAK,UAAU,IAAI,2BAAmB,KAAK,OAAO,KAAK,QAAQ;AAAA,MAC9D,iBAAiB;AAAA,IAClB,CAAC;AAED,SAAK,YAAY,IAAI,GAAG,CAAC;AAEzB,mBAAe,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB;AAChB,WAAO,KAAK,YAAY;AAAA,MACvB,KAAK,UAAU,EAAE;AAAA,MACjB,KAAK,UAAU,EAAE;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS;AACR,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQC,WAAU;AACjB,UAAM,QAAQA,SAAQ;AACtB,IAAAA,UAAS,aAAa,KAAK,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKA,WAAU;AACd,IAAAA,UAAS;AAAA,MACR,KAAK,QAAQ;AAAA,MACb,KAAK,UAAU,EAAE;AAAA,MACjB,KAAK,UAAU,EAAE;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,cAAU,QAAQ,KAAK,KAAK;AAC5B,SAAK,QAAQ;AACb,wBAAK,KAAK,KAAK,OAAO;AACtB,SAAK,QAAQ,QAAQ;AACrB,SAAK,UAAU;AACf,gBAAY,QAAQ,KAAK,WAAW;AACpC,SAAK,cAAc;AACnB,UAAM,QAAQ;AAAA,EACf;AACD;;;ACxMA,IAAqB,kBAArB,cAA6C,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BnD,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,QAAQ;AAGpB,QACC,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,WAAW,UAC1B;AACD,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC5D;AAGA,SAAK,QAAQ,KAAK,MAAM,SAAS,KAAK;AACtC,SAAK,SAAS,KAAK,MAAM,SAAS,MAAM;AAGxC,SAAK,YAAY,KAAK;AACtB,SAAK,aAAa,KAAK;AAEvB,SAAK,SAAS,SAAS;AACvB,SAAK,SAAS,SAAS;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACX,WAAO,MAAM;AAAA,EACd;AAAA,EACA,IAAI,MAAM,OAAO;AAChB,UAAM,QAAQ,KAAK,YAAY;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACZ,WAAO,MAAM;AAAA,EACd;AAAA,EACA,IAAI,OAAO,OAAO;AACjB,UAAM,SAAS,KAAK,aAAa;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAKC,WAAU;AAEd,UAAM,QAAQ,KAAK;AAGnB,QAAI,KAAK,KAAK,IAAI;AAClB,UAAM,KAAK,KAAK,IAAI;AAEpB,QAAI,IAAI,MAAM;AACd,QAAI,IAAI,MAAM;AAGd,UAAM,eAAe,MAAM;AAC3B,UAAM,WAAW,KAAK;AAGtB,QAAI,MAAM,UAAU,GAAG;AACtB,MAAAA,UAAS,UAAU,CAAC,IAAI,CAAC,EAAE;AAC3B,MAAAA,UAAS,OAAO,MAAM,KAAK;AAC3B,YAAM;AACN,UAAI,MAAM;AACV,UAAI,MAAM;AAAA,IACX;AAEA,UAAM,KAAK,SAAS,IAAI,aAAa;AACrC,UAAM,KAAK,SAAS,IAAI,aAAa;AAGrC,UAAM,eAAe,KAAK,UAAU,IAAI;AACxC,UAAM,gBAAgB,KAAK,UAAU,IAAI;AAOzC,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IACD;AAGA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK,IAAI;AAAA;AAAA,MACT;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA,KAAK,KAAK,YAAY;AAAA;AAAA,MACtB;AAAA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IACD;AAEA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL;AAAA;AAAA,MACA,KAAK,IAAI;AAAA;AAAA,MACT;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK,KAAK,aAAa;AAAA;AAAA,MACvB;AAAA,MACA;AAAA;AAAA,IACD;AAEA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK,IAAI;AAAA;AAAA,MACT,KAAK,IAAI;AAAA;AAAA,MACT;AAAA,MACA;AAAA;AAAA,MACA,KAAK,KAAK,YAAY;AAAA;AAAA,MACtB,KAAK,KAAK,aAAa;AAAA;AAAA,MACvB;AAAA,MACA;AAAA;AAAA,IACD;AAGA,UAAM,qBAAqB,KAAK,gBAAgB;AAChD,UAAM,sBAAsB,KAAK,iBAAiB;AAElD,UAAM,sBAAsB,KAAK,aAAa,gBAAgB;AAC9D,UAAM,uBAAuB,KAAK,cAAc,iBAAiB;AAGjE,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACD;AAGA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK,IAAI;AAAA;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK;AAAA;AAAA,MACL,KAAK,KAAK,aAAa;AAAA;AAAA,MACvB;AAAA;AAAA,MACA;AAAA;AAAA,IACD;AAGA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL;AAAA;AAAA,MACA,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,IACD;AAGA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK,IAAI;AAAA;AAAA,MACT,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK,KAAK,YAAY;AAAA;AAAA,MACtB,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,IACD;AAGA,IAAAA,UAAS;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,MACA,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL;AAAA;AAAA,MACA;AAAA;AAAA,IACD;AAAA,EACD;AACD;;;AClPe,SAAR,gBAAiC,SAAS,OAAO;AACvD,UAAQ,OAAO,MAAM;AACrB,UAAQ,YAAY,MAAM,UAAU,OAAO;AAC3C,UAAQ,cAAc,MAAM,YAAY,OAAO;AAC/C,UAAQ,YAAY,MAAM;AAC1B,UAAQ,YAAY,MAAM;AAC1B,UAAQ,eAAe,MAAM;AAC9B;;;ACMA,IAAM,SAAS,CAAC,MAAM,MAAM,MAAM,IAAI;AACtC,IAAM,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;AAK7B,IAAqB,OAArB,cAAkC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB5C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,SAAS,SAAS,GAAG,SAAS,UAAU,CAAC;AAOrD,SAAK,YAAY,UAAU,IAAI,GAAG,GAAG,CAAC;AAOtC,SAAK,cAAc,UAAU,IAAI,GAAG,GAAG,CAAC;AAOxC,SAAK,YAAY;AAQjB,SAAK,YAAY;AAQjB,SAAK,eAAe;AAQpB,SAAK,aAAa;AAQlB,SAAK,gBAAgB;AAOrB,SAAK,WAAW;AAMhB,SAAK,QAAQ,CAAC;AAGd,SAAK,aAAa,GAAG,GAAG,QAAQ;AAAA,EACjC;AAAA;AAAA,EAGA,aAAa,GAAG,GAAG,UAAU;AAC5B,QAAI,OAAO,KAAK,cAAc,aAAa;AAC1C,WAAK,YAAY,UAAU,IAAI,GAAG,GAAG,CAAC;AAAA,IACvC;AAEA,QAAI,OAAO,KAAK,gBAAgB,aAAa;AAC5C,WAAK,cAAc,UAAU,IAAI,GAAG,GAAG,CAAC;AAAA,IACzC;AAEA,QAAI,OAAO,SAAS,cAAc,aAAa;AAC9C,UAAI,SAAS,qBAAqB,OAAO;AACxC,aAAK,UAAU,KAAK,SAAS,SAAS;AAAA,MACvC,OAAO;AAEN,aAAK,UAAU,SAAS,SAAS,SAAS;AAAA,MAC3C;AAAA,IACD;AAEA,QAAI,OAAO,SAAS,gBAAgB,aAAa;AAChD,UAAI,SAAS,uBAAuB,OAAO;AAC1C,aAAK,YAAY,KAAK,SAAS,WAAW;AAAA,MAC3C,OAAO;AAEN,aAAK,YAAY,SAAS,SAAS,WAAW;AAAA,MAC/C;AAAA,IACD;AAEA,SAAK,YAAY,SAAS,aAAa;AACvC,SAAK,YAAY,SAAS,aAAa;AACvC,SAAK,eAAe,SAAS,gBAAgB;AAC7C,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,gBAAgB,SAAS,iBAAiB;AAC/C,SAAK,WAAW;AAGhB,QAAI,OAAO,SAAS,gBAAgB,aAAa;AAChD,WAAK,YAAY,IAAI,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,IACpE,OAAO;AACN,WAAK,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1B;AAGA,QAAI,OAAO,SAAS,aAAa,aAAa;AAC7C,WAAK,WAAW,CAAC,CAAC,SAAS;AAAA,IAC5B;AAGA,SAAK,QAAQ,SAAS,MAAM,SAAS,IAAI;AAGzC,QAAI,SAAS,SAAS,MAAM;AAC3B,WAAK,KAAK;AAAA,IACX;AACA,QAAI,SAAS,WAAW,MAAM;AAC7B,WAAK,OAAO;AAAA,IACb;AAIA,SAAK,gBAAgB,IAAI,2BAAmB,GAAG,GAAG;AAAA,MACjD,iBAAiB;AAAA,IAClB,CAAC;AAGD,SAAK,UAAU,IAAI,oBAAY,IAAI;AAGnC,SAAK,QAAQ,SAAS,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,SAAK,OAAO,UAAU,KAAK;AAC3B,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,SAAK,OAAO,YAAY,KAAK;AAC7B,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,MAAM,OAAO,IAAI;AAExB,UAAM,aAAa,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU;AACjD,cAAQ,MAAM,KAAK;AACnB,aAAO,CAAC,oBAAoB,KAAK,KAAK,IAAI,MAAM,QAAQ,MAAM;AAAA,IAC/D,CAAC;AAGD,QAAI,OAAO,SAAS,UAAU;AAC7B,WAAK,WAAW;AAChB,cAAQ;AAAA,IACT,OAAoB;AAEnB,YAAM,SAAS,KAAK,MAAM,mBAAmB;AAC7C,WAAK,WAAW,WAAW,OAAO,CAAC,CAAC;AACpC,UAAI,OAAO,CAAC,GAAG;AACd,aAAK,YAAY,KAAK,OAAO,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,MAChD,OAAO;AAEN,gBAAQ;AAAA,MACT;AAAA,IACD;AACA,SAAK,SAAS,KAAK;AACnB,SAAK,OAAO,OAAO,MAAM,WAAW,KAAK,GAAG;AAE5C,SAAK,UAAU;AAEf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAQ,IAAI;AACnB,UAAM,SAAS,KAAK,UAAU;AAG9B,QAAI,KAAK,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AAC/C,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC1B,aAAK,SAAS,KAAK,OAAO,MAAM,IAAI;AAAA,MACrC,OAAO;AACN,aAAK,QAAQ;AAAA,MACd;AAAA,IACD;AAGA,QAAI,KAAK,MAAM,SAAS,KAAK,KAAK,gBAAgB,GAAG;AACpD,WAAK,QAAQ,KAAK,QAAQ;AAAA,QACzB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,cAAc;AAAA,MACpB;AAAA,IACD;AAGA,WAAO;AAAA,MACN,KAAK,QAAQ,YAAY,KAAK,OAAO,KAAK,cAAc,OAAO;AAAA,MAC/D;AAAA,IACD;AAGA,QAAI,QAAQ,KAAK,KAAK,KAAK,QAAQ,KAAK;AACxC,QAAI,SAAS,KAAK,KAAK,KAAK,QAAQ,MAAM;AAE1C,QAAI,SAAe,iBAAiB,GAAG;AAEtC,cAAQ,eAAe,KAAK,QAAQ,KAAK;AACzC,eAAS,eAAe,KAAK,QAAQ,MAAM;AAAA,IAC5C;AAGA,SAAK,cAAc,WAAW,QAAc;AAG5C,QACC,KAAK,cAAc,QAAQ,SAC3B,KAAK,cAAc,SAAS,QAC3B;AACD,WAAK,cAAc,OAAO,OAAO,MAAM;AAAA,IACxC;AAEA,SAAK,cAAc,MAAM;AACzB,SAAK;AAAA,MACJ,KAAK,cAAc;AAAA,MACnB,KAAK;AAAA,MACL,KAAK,IAAI,IAAI,KAAK,QAAQ;AAAA,MAC1B,KAAK,IAAI,IAAI,KAAK,QAAQ;AAAA,IAC3B;AAEA,SAAK,UAAU;AAEf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAYC,WAAU,OAAO,KAAK,OAAO;AACxC,WAAO,KAAK,QAAQ,YAAY,MAAM,KAAK,cAAc,OAAO;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAKA,WAAU,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;AAEpD,QAAI,OAAO,KAAK,aAAa,aAAa;AAEzC,UAAI,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;AACzC,aAAK,IAAI,IAAI;AACb,aAAK,IAAI,IAAI;AACb,aAAK,UAAU;AAAA,MAChB;AAGA,WAAK,QAAQ,IAAI;AAGjB,MAAAA,UAAS,KAAK;AAGd,MAAAA,UAAS,eAAeA,UAAS,YAAY,IAAI,KAAK,WAAW,CAAC;AAAA,IACnE;AAGA,QAAI,KAAK,QAAQ;AACjB,QAAI,KAAK,QAAQ;AAGjB,QAAIA,UAAS,SAAS,aAAa,OAAO;AACzC,UAAI,CAAC,CAAC;AACN,UAAI,CAAC,CAAC;AAAA,IACP;AAGA,IAAAA,UAAS,UAAU,KAAK,cAAc,QAAQ,GAAG,CAAC;AAGlD,QAAI,OAAO,KAAK,aAAa,aAAa;AAEzC,MAAAA,UAAS,QAAQ;AAAA,IAClB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAS,MAAM,GAAG,GAAG;AAC9B,oBAAgB,SAAS,IAAI;AAE7B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,YAAM,SAAS,KAAK,CAAC,EAAE,QAAQ;AAE/B,UAAI,KAAK,UAAU,QAAQ,GAAG;AAC7B,gBAAQ,SAAS,QAAQ,GAAG,CAAC;AAAA,MAC9B;AAEA,UAAI,KAAK,YAAY,KAAK,KAAK,YAAY,QAAQ,GAAG;AACrD,gBAAQ,WAAW,QAAQ,GAAG,CAAC;AAAA,MAChC;AAEA,WAAK,KAAK,QAAQ,WAAW;AAAA,IAC9B;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,QAAI,OAAO,SAAe,OAAO,aAAa;AAE7C,eAAe,cAAc,MAAM;AACnC,eAAe,kBAAkB;AAAA,QAChC,SAAe,kBAAkB,aAAa,KAAK,aAAa;AAAA,MACjE;AACA,WAAK,gBAAgB;AAAA,IACtB;AACA,aAAe,MAAM,OAAO,KAAK,cAAc,MAAM;AACrD,wBAAK,KAAK,KAAK,aAAa;AAC5B,SAAK,cAAc,QAAQ;AAC3B,SAAK,gBAAgB;AACrB,cAAU,QAAQ,KAAK,SAAS;AAChC,cAAU,QAAQ,KAAK,WAAW;AAClC,SAAK,YAAY,KAAK,cAAc;AACpC,SAAK,UAAU;AACf,SAAK,MAAM,SAAS;AACpB,UAAM,QAAQ;AAAA,EACf;AACD;;;ACxZA,IAAM,cAAN,cAA0B,OAAO;AAAA;AAAA;AAAA;AAAA,EAIhC,YAAY,UAAU;AAErB,UAAM;AAON,SAAK,WAAW;AAEhB,SAAK,UAAU,GAAG,GAAG,GAAG,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,QAAI,KAAK,oBAAoB,MAAM;AAClC,aAAO,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,IAC/C,OAAO;AAEN,aACC,KAAK,SAAS,SAAS,YACvB,KAAK,SAAS,aACd,KAAK,SAAS,UAAU;AAAA,IAE1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAAM,SAAS;AACxB,QAAI,KAAK,oBAAoB,MAAM;AAClC,aAAO,QAAQ,YAAY,IAAI,EAAE;AAAA,IAClC,OAAO;AAEN,YAAM,aAAa,KAAK,MAAM,EAAE;AAChC,YAAM,mBAAmB,WAAW;AACpC,UAAI,QAAQ;AACZ,UAAI,YAAY;AAChB,eAAS,IAAI,GAAG,IAAI,kBAAkB,KAAK;AAC1C,cAAM,KAAK,WAAW,CAAC,EAAE,WAAW,CAAC;AACrC,cAAM,QAAQ,KAAK,SAAS,SAAS,OAAO,EAAE;AAC9C,YAAI,OAAO,UAAU,aAAa;AACjC,gBAAM,UACL,aAAa,UAAU,UAAU,UAAU,WAAW,EAAE,IAAI;AAC7D,oBAAU,MAAM,WAAW,WAAW,KAAK,SAAS,UAAU;AAC9D,sBAAY;AAAA,QACb;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,MAAM,SAAS;AAC1B,QAAI;AAEJ,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACzB,iBAAW,KAAK,MAAM,MAAM,IAAI;AAAA,IACjC,OAAO;AACN,gBAAU;AAAA,IACX;AAEA,QAAI,OAAO,YAAY,aAAa;AAEnC,cAAQ,KAAK;AAGb,sBAAgB,SAAS,KAAK,QAAQ;AAAA,IACvC;AAGA,SAAK,QAAQ,KAAK,SAAS;AAE3B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,WAAK,QAAQ,KAAK;AAAA,QACjB,KAAK,UAAU,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO;AAAA,QAC5C,KAAK;AAAA,MACN;AACA,WAAK,UAAU,KAAK,WAAW;AAAA,IAChC;AACA,SAAK,QAAQ,KAAK,KAAK,KAAK,KAAK;AACjC,SAAK,SAAS,KAAK,KAAK,KAAK,MAAM;AAGnC,SAAK,IAAI,KAAK;AAAA,MACb,KAAK,SAAS,cAAc,UACzB,KAAK,SAAS,IAAI,IAAI,KAAK,QAC3B,KAAK,SAAS,cAAc,WAC3B,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,IACnC,KAAK,SAAS,IAAI;AAAA,IACvB;AACA,SAAK,IAAI,KAAK;AAAA,MACb,KAAK,SAAS,aAAa,OAAO,iBAAiB,MAAM,IACtD,KAAK,SAAS,IAAI,IAClB,KAAK,SAAS,iBAAiB,WAC9B,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,IAAI,IAC1C,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW;AAAA,IAC3C;AAEA,QAAI,OAAO,YAAY,aAAa;AAEnC,cAAQ,QAAQ;AAAA,IACjB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,MAAM,OAAO,SAAS;AAC9B,QAAI,cAAc;AAClB,UAAM,SAAS,CAAC;AAEhB,QAAI,MAAM,QAAQ,IAAI,GAAG;AAExB,aAAO,KAAK,KAAK,GAAG;AAAA,IACrB;AAEA,UAAM,QAAQ,KAAK,QAAQ,YAAY,GAAG,EAAE,MAAM,GAAG;AAErD,QAAI,OAAO,YAAY,aAAa;AAEnC,cAAQ,KAAK;AAGb,sBAAgB,SAAS,KAAK,QAAQ;AAAA,IACvC;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,YAAY,KAAK,UAAU,cAAc,OAAO,KAAK,OAAO;AAClE,UAAI,YAAY,OAAO;AAEtB,uBAAe,OAAO;AAAA,MACvB,OAAO;AACN,eAAO,KAAK,cAAc,IAAI;AAC9B,sBAAc,OAAO;AAAA,MACtB;AAAA,IACD;AAEA,WAAO,KAAK,WAAW;AAEvB,QAAI,OAAO,YAAY,aAAa;AAEnC,cAAQ,QAAQ;AAAA,IACjB;AAEA,WAAO;AAAA,EACR;AACD;AACA,IAAO,sBAAQ;;;ACzKf,IAAqB,aAArB,cAAwC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BlD,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,SAAS,SAAS,GAAG,SAAS,UAAU,CAAC;AASrD,SAAK,YAAY,SAAS,aAAa;AASvC,SAAK,eAAe,SAAS,gBAAgB;AAS7C,SAAK,aAAa,SAAS,cAAc;AASzC,SAAK,gBAAgB,SAAS,iBAAiB;AAM/C,SAAK,QAAQ,CAAC;AAMd,SAAK,YAAY,aAAa,IAAI,GAAK,CAAG;AAM1C,SAAK,YACJ,OAAO,SAAS,SAAS,WACtB,SAAS,OACT,SAAS,SAAS,IAAI;AAE1B,QAAI,OAAO,SAAS,aAAa,UAAU;AAM1C,WAAK,WAAW,mBAAmB,IAAI,UAAU,SAAS,IAAI,CAAC;AAAA,IAChE,OAAO;AACN,WAAK,WAAW,mBAAmB;AAAA;AAAA,QAElC,SAAS,SAAS,SAAS,WAAW,IACnC,SAAS,WACT,UAAU,SAAS,QAAQ;AAAA,MAC/B;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,aAAa,aAAa;AAC7C,WAAK,WAAW,CAAC,CAAC,SAAS;AAAA,IAC5B;AAGA,QAAI,OAAO,SAAS,cAAc,aAAa;AAC9C,WAAK,YAAY,SAAS;AAAA,IAC3B;AAGA,QAAI,OAAO,SAAS,gBAAgB,aAAa;AAChD,WAAK,YAAY,IAAI,SAAS,YAAY,GAAG,SAAS,YAAY,CAAC;AAAA,IACpE,OAAO;AACN,WAAK,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1B;AAGA,SAAK,UAAU,IAAI,oBAAY,IAAI;AAGnC,QAAI,OAAO,SAAS,SAAS,YAAY,SAAS,SAAS,GAAK;AAC/D,WAAK,OAAO,SAAS,IAAI;AAAA,IAC1B;AAGA,SAAK,QAAQ,SAAS,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAWC,QAAO;AACrB,SAAK,YAAY;AAEjB,QAAIA,QAAO;AACV,WAAK,OAAOA,MAAK;AAAA,IAClB;AACA,SAAK,UAAU;AAEf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAQ,IAAI;AACnB,QAAI,KAAK,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AAC/C,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC1B,aAAK,SAAS,KAAK,OAAO,MAAM,IAAI;AAAA,MACrC,OAAO;AACN,aAAK,QAAQ;AAAA,MACd;AACA,WAAK,UAAU;AAAA,IAChB;AAEA,QAAI,KAAK,MAAM,SAAS,KAAK,KAAK,gBAAgB,GAAG;AACpD,WAAK,QAAQ,KAAK,QAAQ,SAAS,KAAK,OAAO,KAAK,aAAa;AAAA,IAClE;AAEA,SAAK,aAAa;AAElB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAAW,MAAM;AAC7B,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO,MAAM;AAEb,QAAI,OAAO,KAAK,YAAY,aAAa;AACxC,UAAI;AACJ,UAAI;AAEJ,aAAO,UAAU,KAAK,QAAQ,YAAY,KAAK,KAAK,CAAC;AAErD,cAAQ,KAAK,WAAW;AAAA,QACvB,KAAK;AACJ,eAAK,KAAK,QAAQ,QAAQ;AAC1B;AAAA,QAED,KAAK;AACJ,eAAK,KAAK,QAAQ,QAAQ;AAC1B;AAAA,QAED;AACC,eAAK;AACL;AAAA,MACF;AAGA,cAAQ,KAAK,cAAc;AAAA,QAC1B,KAAK;AACJ,eAAK,KAAK,QAAQ,SAAS;AAC3B;AAAA,QAED,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACJ,eAAK,KAAK,QAAQ,SAAS;AAC3B;AAAA,QAED;AACC,eAAK;AACL;AAAA,MACF;AAGA,aAAO,UAAU,IAAI,EAAE;AAAA,IACxB;AAEA,QAAI,aAAa,MAAM;AACtB,UACC,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,SAAS,wBAAwB,cAC7C,KAAK,aAAa,MACjB;AACD,eAAO,UAAU,KAAK,SAAS,oBAAoB,CAAC;AAAA,MACrD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACf,WAAO,KAAK;AAAA,EACb;AAAA,EACA,IAAI,UAAU,OAAO;AACpB,QAAI,iBAAiB,OAAO;AAC3B,WAAK,KAAK,KAAK,KAAK;AAAA,IACrB,OAAO;AAEN,WAAK,KAAK,SAAS,KAAK;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOA,QAAO;AACb,SAAK,UAAU,IAAIA,QAAOA,MAAK;AAE/B,SAAK,aAAa;AAElB,SAAK,UAAU;AAEf,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAO,KAAK,OAAO;AAC9B,WAAO,KAAK,QAAQ,YAAY,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAKC,WAAU,MAAM,GAAG,GAAG;AAE1B,UAAM,SAASA,UAAS,YAAY;AAIpC,QAAI,OAAO,KAAK,aAAa,aAAa;AAEzC,WAAK,QAAQ,IAAI;AACjB,MAAAA,UAAS,eAAe,SAAS,KAAK,WAAW,CAAC;AAAA,IACnD,OAAO;AAEN,UAAI,KAAK,IAAI;AACb,UAAI,KAAK,IAAI;AAAA,IACd;AAEA,UAAM,KAAK;AACX,UAAM,eAAe,KAAK,QAAQ,WAAW;AAC7C,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC3C,UAAI;AACJ,YAAM,SAAS,KAAK,MAAM,CAAC,EAAE,QAAQ;AAErC,YAAM,cAAc,KAAK,QAAQ,UAAU,MAAM;AACjD,cAAQ,KAAK,WAAW;AAAA,QACvB,KAAK;AACJ,eAAK;AACL;AAAA,QAED,KAAK;AACJ,eAAK,cAAc;AACnB;AAAA,QAED;AACC;AAAA,MACF;AAGA,cAAQ,KAAK,cAAc;AAAA,QAC1B,KAAK;AACJ,eAAK,eAAe;AACpB;AAAA,QAED,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACJ,eAAK;AACL;AAAA,QAED;AACC;AAAA,MACF;AAGA,UAAI,KAAK,YAAY,QAAQ,OAAO,KAAK,aAAa,aAAa;AAClE,YAAI,MAAM,GAAG;AACZ,eAAK,IAAI,IAAI;AAAA,QACd;AACA,YAAI,WAAW,aAAa;AAC3B,qBAAW;AACX,eAAK,IAAI,IAAI;AAAA,QACd;AAAA,MACD;AAGA,UAAI,YAAY;AAChB,eAAS,IAAI,GAAG,MAAM,OAAO,QAAQ,IAAI,KAAK,KAAK;AAElD,cAAM,KAAK,OAAO,WAAW,CAAC;AAC9B,cAAM,QAAQ,KAAK,SAAS,OAAO,EAAE;AAErC,YAAI,OAAO,UAAU,aAAa;AACjC,gBAAM,aAAa,MAAM;AACzB,gBAAM,cAAc,MAAM;AAC1B,gBAAM,UACL,aAAa,UAAU,UAAU,UAAU,WAAW,EAAE,IAAI;AAC7D,gBAAM,SAAS,KAAK,UAAU;AAC9B,gBAAM,SAAS,KAAK,UAAU;AAG9B,cAAI,eAAe,KAAK,gBAAgB,GAAG;AAE1C,YAAAA,UAAS;AAAA,cACR,KAAK;AAAA,cACL,MAAM;AAAA,cACN,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,IAAI,MAAM,UAAU;AAAA,cACpB,IAAI,MAAM,UAAU;AAAA,cACpB,aAAa;AAAA,cACb,cAAc;AAAA,YACf;AAAA,UACD;AAGA,gBAAM,MAAM,WAAW,WAAW;AAClC,sBAAY;AAAA,QACb,OAAO;AACN,kBAAQ;AAAA,YACP,yCAAyC,OAAO,aAAa,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD;AAEA,WAAK;AAAA,IACN;AAEA,QAAI,OAAO,KAAK,aAAa,aAAa;AAEzC,MAAAA,UAAS,eAAe,MAAM;AAAA,IAC/B;AAIA,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,iBAAa,QAAQ,KAAK,SAAS;AACnC,SAAK,YAAY;AACjB,uBAAmB,QAAQ,KAAK,QAAQ;AACxC,SAAK,WAAW;AAChB,SAAK,MAAM,SAAS;AACpB,SAAK,UAAU;AACf,UAAM,QAAQ;AAAA,EACf;AACD;;;ACjaA,IAAqB,UAArB,cAAqC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0B/C,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,SAAS,SAAS,GAAG,SAAS,UAAU,CAAC;AAGrD,SAAK,YAAY,IAAI,GAAG,CAAC;AAEzB,SAAK,OAAO,SAAS;AACrB,SAAK,WAAW,SAAS;AACzB,SAAK,SAAS;AAGd,SAAK,OAAO;AACZ,SAAK,OAAO,SAAS;AACrB,SAAK,KAAK,SAAS;AAGnB,SAAK,YAAY,SAAS;AAG1B,SAAK,kBAAkB;AAAA;AAAA,MAEtB,OAAO;AAAA,IACR;AAEA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,EAAE,QAAQ,CAAC,aAAa;AACvB,UAAI,OAAO,SAAS,QAAQ,MAAM,aAAa;AAC9C,aAAK,gBAAgB,QAAQ,IAAI,SAAS,QAAQ;AAAA,MACnD;AAAA,IACD,CAAC;AAGD,QAAI,QAAQ,SAAS;AACrB,QAAI,OAAO,UAAU,aAAa;AACjC,cAAQ,YAAY,IAAI,GAAG,GAAG;AAAA,QAC7B,aAAa,IAAI,GAAG,CAAC;AAAA,QACrB,aAAa,IAAI,KAAK,OAAO,CAAC;AAAA,QAC9B,aAAa,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,MACzC,CAAC;AAAA,IACF;AACA,SAAK,OAAO,IAAI,KAAK,MAAM,KAAK;AAChC,SAAK,KAAK,gBAAgB,UAAU,MAAM;AAE1C,SAAK,KAAK,iBAAiB,UAAU,MAAM,aAAa;AACxD,SAAK,KAAK,UAAU,IAAI;AACxB,SAAK,OAAO,KAAK,KAAK,UAAU,EAAE,OAAO,KAAK,KAAK,UAAU,EAAE,MAAM;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AACpB,UAAM,QAAQ,KAAK,SAAS,gBAAgB;AAE5C,QAAI,OAAO,KAAK,gBAAgB,cAAc,UAAU;AACvD,WAAK,gBAAgB,YAAY,MAAM;AAAA,QACtC,KAAK,gBAAgB;AAAA,MACtB,EAAE,CAAC;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAChB,UAAM,QAAQ,KAAK,SAAS,gBAAgB;AAC5C,UAAM,KAAK,KAAK,WAAW,KAAK,mBAAmB,CAAC;AACpD,UAAM,IAAI,SAAS,QAAQ,KAAK,MAAM,KAAK,QAAQ;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,UAAM,kBAAkB,KAAK,mBAAmB;AAChD,UAAM,QAAQ,KAAK,SAAS,gBAAgB;AAE5C,QAAI,gBAAgB,UAAU,SAAS;AACtC,WAAK,YAAY,gBAAgB;AAGjC,UAAI,KAAK,QAAQ,KAAK,UAAU;AAC/B,YAAI,CAAC,KAAK,QAAQ;AACjB,eAAK,SAAS;AACd,gBAAM,IAAI,SAAS,OAAO,KAAK,MAAM,KAAK,UAAU,MAAM;AACzD,mBAAO,KAAK,eAAe;AAAA,UAC5B,CAAC;AAAA,QACF;AAAA,MACD,OAAO;AACN,cAAM,KAAK,KAAK,WAAW,eAAe;AAAA,MAC3C;AAAA,IACD,OAAO;AACN,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACvC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc;AACb,QAAI,KAAK,SAAS,WAAW;AAC5B,WAAK,aAAa,MAAM,IAAI;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AACD;;;ACjJA,IAAqB,gBAArB,cAA2C,UAAU;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASX,YAAY,GAAG,GAAG,GAAG,GAAG;AACvB,UAAM,GAAG,GAAG,GAAG,CAAC;AAMhB,SAAK,cAAc;AAOnB,SAAK,cAAc;AAOnB,SAAK,gBAAgB;AAOrB,SAAK,aAAa;AAOlB,SAAK,QAAQ;AAOb,SAAK,WAAW;AAGhB,SAAK,cAAc;AAGnB,SAAK,cAAc;AAGnB,SAAK,0BAA0B;AAE/B,SAAK,2BAA2B,KAAK,YAAY,KAAK,IAAI;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAO;AAEd,QAAI,MAAM,WAAW,KAAK,KAAK,aAAa;AAC3C,WAAK,UAAU;AACf,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY;AACpB,sBAAM,WAAW,KAAK,WAAW;AACjC,aAAK,cAAc,cAAM;AAAA,UACxB,MAAM;AACL,mBAAO,KAAK,KAAK;AAAA,UAClB;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACD;AACA,aAAK,WAAW;AAAA,MACjB;AACA,UAAI,KAAK,aAAa;AACrB,aAAK,WAAW,IAAI,MAAM,OAAO,MAAM,KAAK;AAC5C,aAAK,WAAW,IAAI,KAAK,GAAG;AAAA,MAC7B;AACA,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACT,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,QAAI,KAAK,gBAAgB,MAAM;AAC9B,mBAAa,YAAY,aAAa,KAAK,wBAAwB;AAEnE,WAAK,aAAa,aAAa,IAAI,GAAG,CAAC;AAAA,IACxC;AACA,WAAO,KAAK,OAAO,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAO;AAClB,QAAI,KAAK,UAAU,QAAQ,KAAK,aAAa,OAAO;AAEnD,WAAK,IAAI,IAAI,MAAM,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC;AACjD,WAAK,IAAI,IAAI,KAAK,UAAU;AAE5B,WAAK,UAAU;AACf,aAAO,KAAK,OAAO,KAAK;AAAA,IACzB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,QAAI,KAAK,gBAAgB,MAAM;AAE9B,mBAAa,eAAe,aAAa,KAAK,wBAAwB;AACtE,mBAAa,QAAQ,KAAK,UAAU;AACpC,WAAK,aAAa;AAAA,IACnB;AACA,SAAK,QAAQ,KAAK;AAClB,WAAO,KAAK,MAAM,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAO;AACd,QAAI,KAAK,aAAa,OAAO;AAC5B,WAAK,WAAW;AAChB,WAAK,UAAU;AACf,oBAAM,WAAW,KAAK,WAAW;AACjC,WAAK,cAAc;AACnB,aAAO,KAAK,UAAU,KAAK;AAAA,IAC5B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,kBAAM,WAAW,KAAK,WAAW;AACjC,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,QAAI,CAAC,KAAK,UAAU;AACnB,WAAK,OAAO;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,kBAAkB;AAEjB,yBAAqB,eAAe,MAAM,CAAC,MAAM;AAChD,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,aAAa,MAAM,CAAC,MAAM;AAC9C,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,iBAAiB,MAAM,CAAC,MAAM;AAClD,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,gBAAgB,MAAM,CAAC,MAAM;AACjD,aAAO,KAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AACD,yBAAqB,gBAAgB,MAAM,CAAC,MAAM;AACjD,aAAO,KAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAGD,UAAM,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB;AAEnB,wBAAoB,eAAe,IAAI;AACvC,wBAAoB,aAAa,IAAI;AACrC,wBAAoB,iBAAiB,IAAI;AACzC,wBAAoB,gBAAgB,IAAI;AACxC,wBAAoB,gBAAgB,IAAI;AACxC,kBAAM,WAAW,KAAK,WAAW;AACjC,SAAK,cAAc;AAMnB,QAAI,KAAK,gBAAgB,MAAM;AAC9B,mBAAa,eAAe,aAAa,KAAK,wBAAwB;AACtE,UAAI,OAAO,KAAK,eAAe,aAAa;AAC3C,qBAAa,QAAQ,KAAK,UAAU;AACpC,aAAK,aAAa;AAAA,MACnB;AAAA,IACD;AAGA,UAAM,kBAAkB;AAAA,EACzB;AACD;;;AC1RA,IAAqB,kBAArB,cAA6C,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BX,YAAY,GAAG,GAAG,UAAU;AAE3B,UAAM,GAAG,GAAG,QAAQ;AAOpB,SAAK,cAAc;AAOnB,SAAK,gBAAgB;AAOrB,SAAK,aAAa;AAOlB,SAAK,QAAQ;AAGb,SAAK,cAAc;AACnB,SAAK,WAAW;AAGhB,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAO;AAEd,QAAI,MAAM,WAAW,KAAK,KAAK,aAAa;AAC3C,WAAK,UAAU;AACf,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY;AACpB,sBAAM,WAAW,KAAK,WAAW;AACjC,aAAK,cAAc,cAAM;AAAA,UACxB,MAAM;AACL,mBAAO,KAAK,KAAK;AAAA,UAClB;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACD;AACA,aAAK,WAAW;AAAA,MACjB;AACA,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,WAAO,KAAK,OAAO,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,QAAQ,KAAK;AAClB,WAAO,KAAK,MAAM,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAO;AACd,QAAI,KAAK,aAAa,OAAO;AAC5B,WAAK,WAAW;AAChB,WAAK,UAAU;AACf,oBAAM,WAAW,KAAK,WAAW;AACjC,WAAK,cAAc;AACnB,aAAO,KAAK,UAAU,KAAK;AAAA,IAC5B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,kBAAM,WAAW,KAAK,WAAW;AACjC,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,QAAI,CAAC,KAAK,UAAU;AACnB,WAAK,OAAO;AAAA,IACb;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,kBAAkB;AAEjB,yBAAqB,eAAe,MAAM,CAAC,MAAM;AAChD,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,aAAa,MAAM,CAAC,MAAM;AAC9C,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,iBAAiB,MAAM,CAAC,MAAM;AAClD,aAAO,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AACD,yBAAqB,gBAAgB,MAAM,CAAC,MAAM;AACjD,aAAO,KAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AACD,yBAAqB,gBAAgB,MAAM,CAAC,MAAM;AACjD,aAAO,KAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB;AAEnB,wBAAoB,eAAe,IAAI;AACvC,wBAAoB,aAAa,IAAI;AACrC,wBAAoB,iBAAiB,IAAI;AACzC,wBAAoB,gBAAgB,IAAI;AACxC,wBAAoB,gBAAgB,IAAI;AACxC,kBAAM,WAAW,KAAK,WAAW;AACjC,SAAK,cAAc;AAAA,EACpB;AACD;;;ACpOA,IAAqB,eAArB,cAA0C,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CvD,YAAY,GAAG,GAAG,UAAU;AAC3B,UAAM,GAAG,CAAC;AAMV,SAAK,UAAU,SAAS,WAAW;AAOnC,SAAK,gBACJ,SAAS,iBAAiB,SAAS,mBAAmB;AAOvD,SAAK,eACJ,SAAS,gBAAgB,SAAS,cAAc;AAMjD,SAAK,oBAAoB,SAAS,qBAAqB;AASvD,SAAK,YAAY,SAAS,YAAY,SAAS,aAAa;AAS5D,SAAK,eAAe,SAAS,eAC5B,SAAS,gBAAgB;AAM1B,SAAK,aAAa,IAAI,WAAW,GAAG,GAAG,QAAQ;AAG/C,SAAK,aAAa,KAAK,WAAW,YAAY;AAC9C,aAAS,cAAc,SAAS,eAAe,KAAK,WAAW,QAAQ;AACvE,aAAS,eACR,SAAS,gBAAgB,KAAK,WAAW,SAAS;AAGnD,SAAK,SAAS,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACV;AAGA,SAAK,OAAO,KAAK,OAAO,UAAU,EAAE,OAAO,KAAK,OAAO,UAAU,EAAE,MAAM;AAGzE,SAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,GAAG,KAAK,SAAS,CAAC;AAGvD,SAAK,SAAS,KAAK,UAAU;AAAA,EAC9B;AAAA,EAEA,KAAKC,WAAU;AACd,QAAI,KAAK,UAAU,MAAM;AACxB,MAAAA,UAAS,SAAS,KAAK,YAAY;AAAA,IACpC,OAAO;AACN,MAAAA,UAAS,SAAS,KAAK,aAAa;AAAA,IACrC;AACA,IAAAA,UAAS,KAAK,KAAK,MAAM;AACzB,IAAAA,UAAS,SAAS,KAAK,iBAAiB;AACxC,IAAAA,UAAS,OAAO,KAAK,MAAM;AAC3B,UAAM,KAAKA,SAAQ;AAAA,EACpB;AACD;;;ACzIA,IAAMC,uBAAsB,CAAC,KAAK,GAAG;AAKrC,IAAMC,mBAAkB,IAAI,IAAwBD,oBAAmB;AAEvE,IAAME,wBAAuB,CAC5B,aACoC;AACpC,SAAOD,iBAAgB,IAAI,QAAe;AAC3C;AAKO,IAAM,qBAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,kBAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnC,YAAY,IAAY,GAAG,IAAY,GAAG,UAAuB;AAChE,UAAM,EAAE,OAAO,OAAO,IAAI,MAAM,UAAU,IAAI,SAAS,GAAG,CAAC,GAAG;AAAA,MAC7D,KAAK,CAAC,QAAQ,UAAU,UAAU;AACjC,YAAIC,sBAAqB,QAAQ,GAAG;AACnC,kBAAQ,IAAI,QAAQ,UAAU,KAAK;AACnC,cAAI,KAAK,iBAAiB;AACzB,iBAAK,YAAY;AAAA,UAClB;AACA,iBAAO;AAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAED,SAAK,UAAU;AACf,SAAK,YAAY;AAEjB,QAAI,UAAU;AACb,WAAK,YAAY,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAI,GAAG,IAAI,GAAG;AACjB,SAAK,kBAAkB;AACvB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,YAAY;AACjB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,IAAI,GAAG,IAAI,GAAG;AACtB,SAAK,kBAAkB;AACvB,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU,IAAI;AACnB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI;AACP,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAE,OAAe;AACpB,SAAK,UAAU,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAsB;AACjC,SAAK,YAAY;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,IAAI,GAAG,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAkC;AACtC,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAkC;AACrC,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAkC;AACrC,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,GAAW,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAkC;AACxC,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAW;AACd,WAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AACL,WAAO,KAAK;AAAA,MACX,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,MAC5B,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAa,MAAc;AAChC,WAAO,KAAK,UAAU,MAAM,KAAK,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAa,MAAc;AACpC,WAAO,KAAK,UAAU,UAAU,KAAK,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAkC;AACtC,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAkC;AACtC,WAAO,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACP,WAAO,KAAK,UAAU,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,UAAU,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACN,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,UAAU,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACZ,WAAO,KAAK,UAAU,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,GAAkC;AACtC,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UACI,MACO;AACV,QAAI,KAAK,WAAW,GAAG;AACtB,aAAO,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,IAC/C;AACA,WAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,MAAM,KAAK,CAAC,EAAE;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACX,WAAO,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAe,GAAmC;AACxD,QAAI,KAAK;AACT,QAAI,KAAK;AAET,QAAI,GAAG;AACN,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACR;AAEA,UAAM,IAAI,KAAK,IAAI;AACnB,UAAM,IAAI,KAAK,IAAI;AAEnB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AAExB,WAAO,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAAkC;AACrC,WAAO,KAAK,UAAU,IAAI,CAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAkC;AACvC,WAAO,KAAK,UAAU,MAAM,CAAa;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACT,WAAO,KAAK,UAAU,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACR,WAAO,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,GAAkCC,QAAe;AACrD,SAAK,IAAI,KAAK,IAAIA,UAAS,EAAE,IAAI,KAAK,IAAI,KAAK,IAAIA,UAAS,EAAE,IAAI,KAAK,EAAE;AACzE,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAuC,MAAc;AAChE,UAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC;AAE7D,UAAM,WAAW,KAAK,SAAS,MAAM;AAErC,QAAI,aAAa,KAAM,QAAQ,KAAK,YAAY,OAAO,MAAO;AAC7D,aAAO;AAAA,IACR;AAEA,SAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAEzE,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,GAAkC;AAC1C,WAAO,KAAK,UAAU,SAAS,CAAa;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAkC;AACvC,WAAO,KAAK,UAAU,MAAM,CAAa;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,GAAkC;AACzC,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAkC;AAC1C,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAiB;AACtB,WAAO,uBAAuB,IAAI,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACV,WAAO,KAAK,UAAU,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACR,SAAK,QAAQ;AAAA,EACd;AACD;AAEO,IAAM,yBAAyB,WAGpC,CAAC,GAAG,GAAG,OAAO;AACf,QAAM,SAAS,IAAI,mBAAmB,GAAG,GAAG,EAAE;AAE9C,SAAO;AAAA,IACN,UAAU;AAAA,IACV,MAAMC,KAAI,GAAGC,KAAI,GAAGC,KAAuB;AAC1C,aAAO,SAASF,IAAGC,EAAC;AACpB,UAAIC,KAAI;AACP,eAAO,YAAYA,GAAE;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AACD,CAAC;;;ACtfM,IAAM,gBAAN,cAA4B,2BAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUrD,YAAY,OAAO,QAAQ,YAAY;AACtC,YAAQ,iBAAiB,sBAAsB,QAAQ;AACvD,UAAM,OAAO,QAAQ,UAAU;AAAA,EAChC;AACD;AAUA,eAAe,UAAU,eAAe,SAAU,OAAO;AACxD,UAAQ,gBAAgB,aAAa,QAAQ;AAC7C,OAAK,YAAY;AAClB;AAUA,cAAc,UAAU,eAAe,SAAU,OAAO;AACvD,UAAQ,gBAAgB,aAAa,QAAQ;AAC7C,OAAK,YAAY;AAClB;;;AC8GO,IAAI,cAAc;AAOlB,IAAI,eAAe;AAOnB,IAAM,OAAO,IAAI,YAAY,GAAG,GAAG,EAAE,QAAQ,KAAK,CAAC;AAUnD,SAAS,OAAO;AAEtB,MAAI,gBAAgB,MAAM;AACzB;AAAA,EACD;AAGA,MAAI,EAAE,wBAAwB,SAAS;AACtC,YAAQ,IAAI,iBAAiB,UAAU,wBAAwB;AAAA,EAChE;AAGA,sBAAK,SAAS,aAAa,MAAM;AACjC,sBAAK,SAAS,kBAAkB,WAAW;AAC3C,sBAAK,SAAS,cAAc,OAAO;AACnC,sBAAK,SAAS,cAAc,OAAO;AACnC,sBAAK,SAAS,eAAe,UAAU,IAAI;AAC3C,sBAAK,SAAS,aAAa,MAAM;AACjC,sBAAK,SAAS,sBAAsB,eAAe;AACnD,sBAAK,SAAS,iBAAiB,UAAU;AACzC,sBAAK,SAAS,WAAW,MAAM,IAAI;AACnC,sBAAK,SAAS,iBAAiB,UAAU;AACzC,sBAAK,SAAS,iBAAiB,UAAU;AACzC,sBAAK,SAAS,YAAY,KAAK;AAC/B,sBAAK,SAAS,iBAAiB,YAAY,IAAI;AAE/C,sBAAK,SAAS,UAAU,MAAM;AAC9B,sBAAK,SAAS,eAAe,WAAW;AACxC,sBAAK,SAAS,WAAW,OAAO;AAChC,sBAAK,SAAS,WAAW,OAAO;AAChC,sBAAK,SAAS,SAAS,OAAO,IAAI;AAClC,sBAAK,SAAS,YAAY,UAAU,IAAI;AACxC,sBAAK,SAAS,UAAU,MAAM;AAC9B,sBAAK,SAAS,mBAAmB,eAAe;AAChD,sBAAK,SAAS,cAAc,UAAU;AACtC,sBAAK,SAAS,QAAQ,MAAM,IAAI;AAChC,sBAAK,SAAS,cAAc,UAAU;AACtC,sBAAK,SAAS,cAAc,UAAU;AACtC,sBAAK,SAAS,SAAS,KAAK;AAC5B,sBAAK,SAAS,cAAc,YAAY,IAAI;AAG5C,eAAa,KAAK,IAAI;AAGtB,aAAW,eAAe,EAAE,WAAW,KAAK;AAG5C,oBAAkB;AAGlB,gBAAc;AAGd,MAAI,iBAAiB,MAAM;AAC1B,iBAAa,KAAK,SAAS;AAAA,EAC5B;AACD;AAGA,QAAQ,MAAM;AACb,MAAI,iBAAiB,OAAO;AAC3B,SAAK;AAAA,EACN;AACD,CAAC;",
6
+ "names": ["toString", "globalThis", "globalThis", "navigator", "globalThis", "version", "globalThis", "globalThis", "globalThis", "toString", "globalThis", "Symbol", "globalThis", "document", "globalThis", "globalThis", "TypeError", "get", "state", "state", "toString", "data", "normalize", "globalThis", "globalThis", "require_global_this", "globalThis", "toString", "globalThis", "HowlerGlobal", "self", "Howler", "sound", "muted", "ua", "e", "i", "Howl", "Sound", "seek", "stop", "play", "rate", "cache", "once", "data", "iOS", "version", "panner", "x", "y", "w", "corners", "upperLeft", "upperRight", "lowerRight", "lowerLeft", "radii", "pool", "reset", "alpha", "x", "y", "x", "y", "vertices", "data", "stop", "intersects", "x", "y", "x", "y", "width", "height", "isMobile", "localStorage", "name", "version", "random", "weightedRandom", "random", "weightedRandom", "stored", "hasLocalStorage", "localStorage", "isMobile", "enable", "screen", "orientation", "init", "init", "sound", "mute", "preventDefault", "toHex", "alpha", "scale", "r", "g", "b", "alpha", "x", "y", "z", "reset", "alpha", "x", "y", "z", "cb", "x", "y", "width", "height", "x", "y", "points", "x", "y", "width", "height", "radius", "data", "fontData", "obj", "pools", "data", "shader", "name", "type", "alpha", "position", "renderer", "crossOrigin", "load", "unload", "unloadAll", "version", "data", "data", "onload", "onerror", "data", "onload", "onerror", "renderer", "onload", "onerror", "data", "onload", "onerror", "data", "onload", "onerror", "compare", "prop", "renderer", "sign", "enable", "renderer", "enable", "alpha", "data", "data", "data", "cache", "atlas", "alpha", "data", "data", "orientation", "renderer", "renderer", "renderer", "renderer", "data", "renderer", "data", "zOrder", "level", "onload", "onerror", "data", "data", "onload", "onerror", "crossOrigin", "enable", "load", "onload", "onerror", "unload", "unloadAll", "renderer", "renderer", "renderer", "renderer", "load", "unload", "state", "pauseTrack", "enable", "timerId", "timer", "activeEventList", "pointer", "normalizedEvents", "touchEvent", "scale", "eventType", "level", "primitive_default", "data", "renderer", "renderer", "primitive_default", "alpha", "quad_default", "renderer", "quad_default", "enable", "alpha", "a", "game", "renderer", "scale", "renderer", "emitter", "name", "fn", "renderer", "renderer", "renderer", "renderer", "renderer", "renderer", "scale", "renderer", "renderer", "propertiesToObserve", "setOfProperties", "isObservableProperty", "alpha", "x", "y", "cb"]
7
+ }