ohzi-core 12.5.2 → 12.7.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 (265) hide show
  1. package/README.md +9 -9
  2. package/build/index.mjs +1 -1
  3. package/build/index.mjs.map +1 -1
  4. package/build/index.module.js +2 -0
  5. package/build/index.module.js.map +1 -0
  6. package/package.json +64 -63
  7. package/src/.vscode/settings.json +2 -2
  8. package/src/BaseApplication.js +40 -40
  9. package/src/Browser.js +119 -119
  10. package/src/CameraManager.js +37 -37
  11. package/src/Capabilities.js +13 -13
  12. package/src/CustomBezierCurve.js +58 -58
  13. package/src/Debug.js +359 -359
  14. package/src/Graphics.js +507 -507
  15. package/src/Initializer.js +56 -56
  16. package/src/KeyboardInput.js +177 -177
  17. package/src/OS.js +59 -59
  18. package/src/OScreen.js +90 -90
  19. package/src/OrthographicCamera.js +36 -36
  20. package/src/PerspectiveCamera.js +34 -34
  21. package/src/ReflectionPlaneContext.js +22 -22
  22. package/src/RenderLayers.js +30 -30
  23. package/src/RenderLoop.js +125 -122
  24. package/src/RenderOrder.js +40 -40
  25. package/src/ResourceContainer.js +57 -57
  26. package/src/SceneManager.js +55 -55
  27. package/src/Screen.js +71 -71
  28. package/src/Time.js +99 -98
  29. package/src/UI.js +106 -106
  30. package/src/action_sequencer/ActionEvent.js +22 -22
  31. package/src/action_sequencer/ActionInterpolator.js +39 -39
  32. package/src/action_sequencer/ActionSequencer.js +338 -338
  33. package/src/action_sequencer/NumberInterpolator.js +42 -42
  34. package/src/action_sequencer/VectorInterpolator.js +34 -34
  35. package/src/blitter_index.js +14 -14
  36. package/src/canvas_drawer/CanvasDrawer.js +146 -146
  37. package/src/canvas_drawer/MultiLineTextDrawer.js +58 -58
  38. package/src/canvas_drawer/SimpleTextDrawer.js +55 -55
  39. package/src/components/AudioClip.js +67 -67
  40. package/src/components/AxisHelper.js +60 -60
  41. package/src/components/BaseObject.js +50 -50
  42. package/src/components/EdgeMesh.js +172 -172
  43. package/src/components/GeometryEdgeVisualizer.js +57 -57
  44. package/src/components/Grid.js +40 -40
  45. package/src/components/Line.js +225 -225
  46. package/src/components/MultiLinePath.js +25 -25
  47. package/src/components/MultiLineText2D.js +75 -75
  48. package/src/components/ObjectAxis.js +27 -27
  49. package/src/components/ObjectOrientedBoundingBox.js +228 -228
  50. package/src/components/PlaneHelper.js +38 -38
  51. package/src/components/Shape2D.js +52 -52
  52. package/src/components/Shape3D.js +46 -46
  53. package/src/components/Text2D.js +49 -49
  54. package/src/components/UIElement.js +246 -246
  55. package/src/components/UpdatableMaterialMesh.js +26 -26
  56. package/src/components/WorldImage.js +101 -101
  57. package/src/components/mouse_interactors/ObjectRotator.js +64 -64
  58. package/src/components/sdf_text/SDFText.js +156 -156
  59. package/src/components/sdf_text/SDFTextBatch.js +195 -195
  60. package/src/components/sdf_text/TextGlyph.js +17 -17
  61. package/src/data_textures/CustomDataTexture.js +53 -53
  62. package/src/data_textures/RGBADataTexture.js +14 -14
  63. package/src/data_textures/RGBAFloatDataTexture.js +14 -14
  64. package/src/data_textures/RGBDataTexture.js +14 -14
  65. package/src/data_textures/RGBFloatDataTexture.js +13 -13
  66. package/src/editor/ManipulatorHandle.js +73 -73
  67. package/src/editor/ObjectEditor.js +68 -68
  68. package/src/editor/ObjectManipulator.js +112 -112
  69. package/src/editor/ObjectPicker.js +77 -77
  70. package/src/editor/shaders/object_picker.frag +5 -5
  71. package/src/editor/shaders/object_picker.vert +7 -7
  72. package/src/gpu_particles/GPUParticleSystem.js +111 -111
  73. package/src/gpu_particles/ParticleAttribute.js +89 -89
  74. package/src/gpu_particles/ParticlePositionAttribute.js +42 -42
  75. package/src/html_utilities/CSSAnimator.js +66 -66
  76. package/src/html_utilities/css_animator_states/Animating.js +46 -46
  77. package/src/html_utilities/css_animator_states/Idle.js +27 -27
  78. package/src/index.js +134 -134
  79. package/src/loaders/AsyncAbstractLoader.js +160 -160
  80. package/src/loaders/AsyncAudiosLoader.js +34 -34
  81. package/src/loaders/AsyncObjectsLoader.js +44 -44
  82. package/src/loaders/AsyncTexturesLoader.js +81 -70
  83. package/src/loaders/assets_loader/AsyncAssetsLoaderWorker.js +69 -69
  84. package/src/loaders/assets_loader/ResourceContainer.js +37 -37
  85. package/src/loaders/assets_loader/ResourceLoaderChecker.js +39 -39
  86. package/src/materials/AddMaterial.js +20 -20
  87. package/src/materials/AlphaFilterMaterial.js +23 -23
  88. package/src/materials/BaseShaderMaterial.js +21 -21
  89. package/src/materials/BlitMaterial.js +30 -30
  90. package/src/materials/BloomComposeMaterial.js +24 -24
  91. package/src/materials/BoxBlurMaterial.js +16 -16
  92. package/src/materials/ClearAlphaMaterial.js +15 -15
  93. package/src/materials/ClearColorMaterial.js +33 -33
  94. package/src/materials/ClearDepthNormalMaterial.js +16 -16
  95. package/src/materials/DeferredRendererComposeMaterial.js +35 -35
  96. package/src/materials/DepthNormalMaterial.js +30 -30
  97. package/src/materials/DisplayNormalTextureMaterial.js +18 -18
  98. package/src/materials/DualFilteringBlurMaterial.js +14 -14
  99. package/src/materials/FXAAMaterial.js +12 -12
  100. package/src/materials/GaussianBlurMaterial.js +40 -40
  101. package/src/materials/LuminosityHighPassMaterial.js +26 -26
  102. package/src/materials/MedianFilterMaterial.js +45 -45
  103. package/src/materials/NormalMaterial.js +19 -19
  104. package/src/materials/SDFScreenTextMaterial.js +34 -34
  105. package/src/materials/SDFTextMaterial.js +41 -41
  106. package/src/materials/SSAOComposeMaterial.js +14 -14
  107. package/src/materials/SSAOMaterial.js +65 -65
  108. package/src/materials/ScreenSpaceTextureMaterial.js +67 -67
  109. package/src/materials/UIElementMaterial.js +30 -30
  110. package/src/materials/UnrealBloomComposeMaterial.js +100 -100
  111. package/src/materials/UnrealBlurMaterial.js +20 -20
  112. package/src/materials/UnrealComposeMaterial.js +27 -27
  113. package/src/materials/ViewPositionMaterial.js +19 -19
  114. package/src/materials/deferred/DeferredPointLightMaterial.js +42 -42
  115. package/src/materials/gpu_particles/AttributeUpdateMaterial.js +37 -37
  116. package/src/materials/gpu_particles/BasicParticleMaterial.js +25 -25
  117. package/src/materials/gpu_particles/ParticleStorageMaterial.js +37 -37
  118. package/src/materials/gpu_particles/PositionStorageMaterial.js +26 -26
  119. package/src/object_pool/Pool.js +75 -75
  120. package/src/primitives/Arrow.js +62 -62
  121. package/src/primitives/Cube.js +24 -24
  122. package/src/primitives/HorizontalPlane.js +27 -27
  123. package/src/primitives/Sphere.js +22 -22
  124. package/src/primitives/VerticalPlane.js +26 -26
  125. package/src/raycast/GroupRaycaster.js +43 -43
  126. package/src/raycast/PlaneDragResolver.js +92 -92
  127. package/src/raycast/PlaneRaycastResolver.js +24 -24
  128. package/src/raycast/PlaneRaycaster.js +25 -25
  129. package/src/raycast/RaycastResolver.js +24 -24
  130. package/src/raycast/SurfaceDragResolver.js +80 -80
  131. package/src/raycast/states/BaseState.js +18 -18
  132. package/src/raycast/states/IdleState.js +19 -19
  133. package/src/raycast/states/OnRaycastEnter.js +17 -17
  134. package/src/raycast/states/OnRaycastExit.js +18 -18
  135. package/src/raycast/states/OnRaycastHover.js +27 -27
  136. package/src/render_mode/BaseRender.js +34 -34
  137. package/src/render_mode/BloomRender.js +63 -63
  138. package/src/render_mode/DebugNormalsRender.js +22 -22
  139. package/src/render_mode/DeferredRender.js +110 -110
  140. package/src/render_mode/NormalAORender.js +72 -72
  141. package/src/render_mode/NormalRender.js +38 -38
  142. package/src/render_mode/OutlineRender.js +157 -157
  143. package/src/render_mode/PlanarReflectionsRender.js +121 -121
  144. package/src/render_mode/UnrealBloomRender.js +123 -123
  145. package/src/render_mode/VRRender.js +71 -71
  146. package/src/render_utilities/Blitter.js +101 -101
  147. package/src/render_utilities/Blurrer.js +31 -31
  148. package/src/render_utilities/DepthAndNormalsRenderer.js +47 -47
  149. package/src/render_utilities/DualFilteringBlurrer.js +58 -58
  150. package/src/render_utilities/GaussianBlurrer.js +167 -167
  151. package/src/render_utilities/MedianFilter.js +68 -68
  152. package/src/render_utilities/ViewPositionRenderer.js +50 -50
  153. package/src/resource_loader/BasisLoader.js +51 -51
  154. package/src/resource_loader/FontLoader.js +48 -48
  155. package/src/resource_loader/JSONLoader.js +35 -35
  156. package/src/resource_loader/OBJLoader.js +48 -48
  157. package/src/resource_loader/PointArrayLoader.js +72 -72
  158. package/src/resource_loader/RGBETextureLoader.js +48 -48
  159. package/src/resource_loader/VideoLoader.js +32 -32
  160. package/src/scenes/AbstractScene.js +175 -175
  161. package/src/scenes/loading_states/CompilatorManager.js +41 -41
  162. package/src/scenes/loading_states/HighQualityLoadingState.js +28 -28
  163. package/src/scenes/loading_states/LoadingState.js +117 -117
  164. package/src/scenes/loading_states/RegularLoadingState.js +41 -41
  165. package/src/shaders/add/add.frag +27 -27
  166. package/src/shaders/anti_aliasing/fxaa.frag +72 -72
  167. package/src/shaders/basic_color/basic_color.frag +5 -5
  168. package/src/shaders/basic_color/basic_color.vert +9 -9
  169. package/src/shaders/basic_line/basic_line.frag +36 -36
  170. package/src/shaders/basic_line/basic_line.vert +37 -37
  171. package/src/shaders/basic_texture/basic_texture.frag +9 -9
  172. package/src/shaders/basic_texture/basic_texture.vert +16 -16
  173. package/src/shaders/bloom/bloom_compose_frag.glsl +22 -22
  174. package/src/shaders/bloom/cheap_bloom_compose_frag.glsl +13 -13
  175. package/src/shaders/box_blur/box_blur.frag +24 -24
  176. package/src/shaders/box_blur/compose.frag +31 -31
  177. package/src/shaders/clear/clear_depth_normal.frag +24 -24
  178. package/src/shaders/copy/copy.frag +6 -6
  179. package/src/shaders/copy/copy.vert +5 -5
  180. package/src/shaders/deferred/blit_copy.vert +11 -11
  181. package/src/shaders/deferred/deferred_compose.frag +59 -59
  182. package/src/shaders/deferred/point_light.frag +66 -66
  183. package/src/shaders/deferred/point_light.vert +13 -13
  184. package/src/shaders/depth_normals/debug_normals.frag +47 -47
  185. package/src/shaders/depth_normals/depth_normals.frag +30 -30
  186. package/src/shaders/depth_normals/depth_normals.vert +12 -12
  187. package/src/shaders/dual_filter_blur/alpha_filter.frag +14 -14
  188. package/src/shaders/dual_filter_blur/downsample.frag +21 -21
  189. package/src/shaders/dual_filter_blur/upsample.frag +24 -24
  190. package/src/shaders/edge_visualizer/edge_visualizer.frag +17 -17
  191. package/src/shaders/edge_visualizer/edge_visualizer.vert +15 -15
  192. package/src/shaders/edges/corners.frag +10 -10
  193. package/src/shaders/edges/corners.vert +30 -30
  194. package/src/shaders/edges/edges.frag +6 -6
  195. package/src/shaders/edges/edges.vert +27 -27
  196. package/src/shaders/gaussian_blur/gaussian_blur.frag +43 -43
  197. package/src/shaders/gaussian_blur/unreal_bloom_compose.frag +36 -36
  198. package/src/shaders/gpu_particles/common_utils.glsl +12 -12
  199. package/src/shaders/gpu_particles/generic_storage.frag +6 -6
  200. package/src/shaders/gpu_particles/store/store_position.vert +14 -14
  201. package/src/shaders/gpu_particles/update/basic_update.frag +20 -20
  202. package/src/shaders/gpu_particles/visualize/visualize.frag +10 -10
  203. package/src/shaders/gpu_particles/visualize/visualize.vert +12 -12
  204. package/src/shaders/grid/grid.frag +16 -16
  205. package/src/shaders/grid/grid.vert +9 -9
  206. package/src/shaders/luminosity_high_pass/luminosity_high_pass.frag +37 -37
  207. package/src/shaders/median_filter/median_filter.frag +134 -134
  208. package/src/shaders/normal/normal.frag +6 -6
  209. package/src/shaders/normal/normal.vert +6 -6
  210. package/src/shaders/sdf_text/sdf_screen_text.frag +51 -51
  211. package/src/shaders/sdf_text/sdf_screen_text.vert +41 -41
  212. package/src/shaders/sdf_text/sdf_text.frag +53 -53
  213. package/src/shaders/sdf_text/sdf_text.vert +41 -41
  214. package/src/shaders/ssao/hbao.frag +264 -264
  215. package/src/shaders/ssao/ssao.frag +95 -95
  216. package/src/shaders/ssao/ssao.vert +10 -10
  217. package/src/shaders/ssao/ssao_compose.frag +14 -14
  218. package/src/shaders/transparent_mix/copy.frag +6 -6
  219. package/src/shaders/transparent_mix/transparent_mix.frag +18 -18
  220. package/src/shaders/transparent_mix/transparent_mix.vert +7 -7
  221. package/src/shaders/ui/ss_texture.frag +10 -10
  222. package/src/shaders/ui/ss_texture.vert +31 -31
  223. package/src/shaders/ui/ws_texture.vert +38 -38
  224. package/src/shaders/ui_element/ui_element.frag +11 -11
  225. package/src/shaders/ui_element/ui_element.vert +32 -32
  226. package/src/shaders/unreal_blur/unreal_blur.frag +24 -24
  227. package/src/shaders/unreal_blur/unreal_compose.frag +23 -23
  228. package/src/shaders/write_view_position/write_view_position.frag +6 -6
  229. package/src/shaders/write_view_position/write_view_position.vert +8 -8
  230. package/src/static_batcher/BatchedMesh.js +56 -56
  231. package/src/static_batcher/GeometryBatch.js +308 -308
  232. package/src/static_batcher/GeometryBatcher.js +64 -64
  233. package/src/static_batcher/MeshBatcher.js +58 -58
  234. package/src/ui/ui_element_position/ScreenSpacePosition.js +16 -16
  235. package/src/ui/ui_element_position/WorldSpacePosition.js +23 -23
  236. package/src/ui/ui_element_state/OnIdle.js +24 -24
  237. package/src/ui/ui_element_state/OnMouseEnter.js +39 -39
  238. package/src/ui/ui_element_state/OnMouseExit.js +22 -22
  239. package/src/ui/ui_element_state/OnMouseHover.js +46 -46
  240. package/src/ui/ui_element_state/UIElementState.js +34 -34
  241. package/src/utilities/ArrayUtilities.js +57 -57
  242. package/src/utilities/CameraUtilities.js +283 -283
  243. package/src/utilities/EasingFunctions.js +231 -231
  244. package/src/utilities/FrustumPointFitter.js +257 -257
  245. package/src/utilities/GeometryUtilities.js +76 -76
  246. package/src/utilities/HTMLUtilities.js +76 -76
  247. package/src/utilities/ImageUtilities.js +28 -28
  248. package/src/utilities/MeshSampler.js +206 -206
  249. package/src/utilities/ModelUtilities.js +162 -162
  250. package/src/utilities/OMath.js +158 -158
  251. package/src/utilities/OrthographicFrustumPointFitter.js +49 -49
  252. package/src/utilities/PerspectiveFrustumPointFitter.js +254 -254
  253. package/src/utilities/StringUtilities.js +43 -43
  254. package/src/utilities/TimeUtilities.js +24 -24
  255. package/src/utilities/Validation.js +36 -36
  256. package/src/view_components/ApplicationView.js +73 -73
  257. package/src/view_components/TransitionManager.js +75 -75
  258. package/src/view_components/ViewComponent.js +61 -61
  259. package/src/view_components/ViewComponentManager.js +69 -69
  260. package/src/view_components/ViewManager.js +145 -145
  261. package/src/view_components/ViewState.js +49 -49
  262. package/src/view_components/transition/ActionSequencerBuilder.js +124 -124
  263. package/src/view_components/transition/DrawIOAnimationSheet.js +92 -92
  264. package/src/view_components/transition/TransitionTable.js +54 -54
  265. package/src/view_components/transition/ViewStateTransitionHandler.js +106 -106
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.module.js","sources":["../src/OS.js","../src/utilities/Validation.js","../src/resource_loader/AbstractLoader.js","../src/action_sequencer/ActionSequencer.js","../src/utilities/EasingFunctions.js","../src/action_sequencer/ActionInterpolator.js","../src/action_sequencer/NumberInterpolator.js","../src/view_components/transition/ActionSequencerBuilder.js","../src/EventManager.js","../src/ResourceContainer.js","../src/view_components/transition/DrawIOAnimationSheet.js","../src/view_components/transition/TransitionTable.js","../src/Time.js","../src/view_components/ViewState.js","../src/view_components/transition/ViewStateTransitionHandler.js","../src/view_components/ViewManager.js","../src/view_components/ApplicationView.js","../src/BaseApplication.js","../src/render_mode/BaseRender.js","../src/materials/BaseShaderMaterial.js","../src/resource_loader/BasisLoader.js","../src/materials/BlitMaterial.js","../src/CameraManager.js","../src/Capabilities.js","../src/canvas_drawer/CanvasDrawer.js","../src/Configuration.js","../src/html_utilities/css_animator_states/Idle.js","../src/html_utilities/css_animator_states/Animating.js","../src/html_utilities/CSSAnimator.js","../src/components/AxisHelper.js","../src/SceneManager.js","../src/primitives/Cube.js","../src/primitives/Sphere.js","../src/primitives/Arrow.js","../src/Screen.js","../src/materials/ScreenSpaceTextureMaterial.js","../src/Debug.js","../src/materials/ClearDepthNormalMaterial.js","../src/materials/DepthNormalMaterial.js","../src/render_utilities/DepthAndNormalsRenderer.js","../src/render_utilities/Blitter.js","../src/Graphics.js","../src/materials/NormalMaterial.js","../src/render_mode/DebugNormalsRender.js","../src/Input.js","../src/ReflectionPlaneContext.js","../src/static_batcher/GeometryBatch.js","../src/static_batcher/GeometryBatcher.js","../src/UI.js","../src/utilities/MathUtilities.js","../src/utilities/CameraUtilities.js","../src/Initializer.js","../src/resource_loader/JSONLoader.js","../src/materials/SSAOMaterial.js","../src/materials/SSAOComposeMaterial.js","../src/materials/DisplayNormalTextureMaterial.js","../src/materials/BoxBlurMaterial.js","../src/render_utilities/Blurrer.js","../src/render_mode/NormalAORender.js","../src/render_mode/NormalRender.js","../src/materials/UnrealBloomComposeMaterial.js","../src/materials/AddMaterial.js","../src/materials/GaussianBlurMaterial.js","../src/materials/LuminosityHighPassMaterial.js","../src/render_utilities/GaussianBlurrer.js","../src/render_mode/UnrealBloomRender.js","../src/OrthographicCamera.js","../src/PerspectiveCamera.js","../src/Primitives.js","../src/primitives/HorizontalPlane.js","../src/primitives/VerticalPlane.js","../src/view_components/ViewComponentManager.js","../src/RenderLoop.js","../src/resource_loader/TextureLoader.js","../src/resource_loader/GLTFLoader.js","../src/resource_loader/DAELoader.js","../src/resource_loader/TextLoader.js","../src/resource_loader/CubemapLoader.js","../src/components/AudioClip.js","../src/resource_loader/AudioLoader.js","../src/resource_loader/OBJLoader.js","../src/resource_loader/FontLoader.js","../src/resource_loader/RGBETextureLoader.js","../src/resource_loader/PointArrayLoader.js","../src/resource_loader/HDRCubeTextureLoader.js","../src/resource_loader/GLTFDRACOLoader.js","../src/resource_loader/FileLoader.js","../src/resource_loader/ResourceBatch.js","../src/canvas_drawer/SimpleTextDrawer.js","../src/view_components/ViewComponent.js","../src/utilities/ArrayUtilities.js","../src/utilities/FrustumPointFitter.js","../src/utilities/GeometryUtilities.js","../src/utilities/ImageUtilities.js","../src/utilities/MeshSampler.js","../src/utilities/ModelUtilities.js","../src/utilities/ObjectUtilities.js","../src/utilities/TimeUtilities.js","../src/utilities/PerspectiveFrustumPointFitter.js","../src/utilities/OrthographicFrustumPointFitter.js","../src/components/Grid.js","../src/components/Line.js","../src/components/WorldImage.js","../src/components/Text2D.js","../src/materials/UIElementMaterial.js","../src/ui/ui_element_position/ScreenSpacePosition.js","../src/ui/ui_element_position/WorldSpacePosition.js","../src/ui/ui_element_state/UIElementState.js","../src/ui/ui_element_state/OnIdle.js","../src/ui/ui_element_state/OnMouseEnter.js","../src/ui/ui_element_state/OnMouseExit.js","../src/ui/ui_element_state/OnMouseHover.js","../src/components/UIElement.js","../src/components/UpdatableMaterialMesh.js","../src/components/sdf_text/TextGlyph.js","../src/components/sdf_text/SDFText.js","../src/materials/SDFTextMaterial.js","../src/components/sdf_text/SDFTextBatch.js","../src/action_sequencer/ActionEvent.js","../src/action_sequencer/VectorInterpolator.js","../src/materials/MedianFilterMaterial.js","../src/render_utilities/MedianFilter.js","../src/gpu_particles/GPUParticleSystem.js","../src/materials/DualFilteringBlurMaterial.js"],"sourcesContent":["\r\nclass OS\r\n{\r\n init()\r\n {\r\n this.operating_systems = {\r\n ANDROID: 'android',\r\n IOS: 'ios',\r\n LINUX: 'linux',\r\n MAC: 'mac',\r\n WINDOWS: 'windows'\r\n };\r\n }\r\n\r\n get_os()\r\n {\r\n let userAgent = window.navigator.userAgent;\r\n let platform = window.navigator.platform;\r\n let macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\r\n let windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\r\n let iosPlatforms = ['iPhone', 'iPad', 'iPod'];\r\n let os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.MAC;\r\n }\r\n else if (iosPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.IOS;\r\n }\r\n else if (windowsPlatforms.indexOf(platform) !== -1)\r\n {\r\n os = this.operating_systems.WINDOWS;\r\n }\r\n else if (/Android/.test(userAgent))\r\n {\r\n os = this.operating_systems.ANDROID;\r\n }\r\n else if (!os && /Linux/.test(platform))\r\n {\r\n os = this.operating_systems.LINUX;\r\n }\r\n\r\n return os;\r\n }\r\n\r\n get is_android()\r\n {\r\n return this.get_os() === this.operating_systems.ANDROID;\r\n }\r\n\r\n get is_ios()\r\n {\r\n return navigator.userAgent.match(/(iPhone|iPod|iPad)/) || this.is_ipad;\r\n }\r\n\r\n get is_safari()\r\n {\r\n let ua = navigator.userAgent.toLowerCase();\r\n\r\n if (ua.indexOf('safari') !== -1)\r\n {\r\n if (ua.indexOf('chrome') > -1)\r\n {\r\n return false;\r\n }\r\n else\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get is_ipad()\r\n {\r\n return (navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\r\n }\r\n\r\n get is_mobile()\r\n {\r\n return !!(navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/));\r\n }\r\n\r\n get is_linux()\r\n {\r\n return this.get_os() === this.operating_systems.LINUX;\r\n }\r\n\r\n get is_mac()\r\n {\r\n return this.get_os() === this.operating_systems.MAC;\r\n }\r\n\r\n get is_windows()\r\n {\r\n return this.get_os() === this.operating_systems.WINDOWS;\r\n }\r\n}\r\n\r\nexport default new OS();\r\n","export default class Validation\r\n{\r\n constructor()\r\n {}\r\n\r\n static is_int(n)\r\n {\r\n return Number(n) === n && n % 1 === 0;\r\n }\r\n\r\n static is_float(n)\r\n {\r\n return Number(n) === n && n % 1 !== 0;\r\n }\r\n\r\n static is_number(n)\r\n {\r\n return this.is_int(n) || this.is_float(n);\r\n }\r\n\r\n static is_json(str)\r\n {\r\n try\r\n {\r\n JSON.parse(str);\r\n }\r\n catch (e)\r\n {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import OS from '../OS';\r\nimport Validation from '../utilities/Validation';\r\n\r\nexport default class AbstractLoader\r\n{\r\n constructor(resource_id, url, size = 1)\r\n {\r\n this.resource_id = resource_id;\r\n this.url = url;\r\n this.loaded_bytes = 0;\r\n this.total_bytes = size;\r\n\r\n this.has_finished = false;\r\n this.has_error = false;\r\n this.error_message = 'none';\r\n }\r\n\r\n __update_downloaded_bytes(loaded, total)\r\n {\r\n loaded = Validation.is_number(loaded) ? loaded : 1;\r\n total = Validation.is_number(total) ? total : 1;\r\n\r\n this.loaded_bytes = loaded;\r\n\r\n if (total > 0)\r\n {\r\n this.total_bytes = total;\r\n }\r\n\r\n if (this.loaded_bytes > this.total_bytes)\r\n {\r\n console.warn('Total bytes is smaller than loaded ones. Please set total bytes by hand to:', this.url);\r\n }\r\n }\r\n\r\n __loading_ended()\r\n {\r\n this.has_finished = true;\r\n }\r\n\r\n __set_error(message)\r\n {\r\n this.has_error = true;\r\n this.error_message = message;\r\n }\r\n\r\n print_error()\r\n {\r\n console.error('Error while loading ' + this.resource_id + '\\n\\t path: ' + this.url + '\\n\\t\\t' + this.error_message);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n const cache = OS.is_safari ? 'no-cache' : 'default';\r\n\r\n fetch(this.url, {\r\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: cache, // *default, no-cache, reload, force-cache, only-if-cached\r\n credentials: 'same-origin', // include, *same-origin, omit\r\n redirect: 'follow' // manual, *follow, error\r\n })\r\n .then(this.on_progress.bind(this, resource_container))\r\n .catch(this.__on_error.bind(this));\r\n }\r\n\r\n async on_progress(resource_container, response)\r\n {\r\n const reader = response.body.getReader();\r\n\r\n // Step 2: get total length\r\n let contentLength = +response.headers.get('Content-Length');\r\n\r\n // Step 3: read the data\r\n let receivedLength = 0; // received that many bytes at the moment\r\n\r\n while (true)\r\n {\r\n const { done, value } = await reader.read();\r\n\r\n if (done)\r\n {\r\n break;\r\n }\r\n\r\n receivedLength += value.length;\r\n\r\n this.__update_downloaded_bytes(receivedLength, contentLength);\r\n // console.log(`Received ${receivedLength} of ${contentLength}`);\r\n }\r\n\r\n this.on_preloaded_finished(resource_container);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n }\r\n\r\n __on_error(data)\r\n {\r\n console.error(data);\r\n }\r\n}\r\n","\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class ActionSequencer\r\n{\r\n constructor(context)\r\n {\r\n this.elapsed_time = -0.00001;\r\n\r\n this.playing = false;\r\n\r\n this.action_events = [];\r\n this.context = context;\r\n\r\n this.initial_context = JSON.parse(JSON.stringify(context));\r\n\r\n this.tmp_t = 0;\r\n\r\n this.channels = {};\r\n\r\n let channel_names = Object.keys(context);\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n this.channels[channel_names[i]] = [];\r\n }\r\n\r\n this.duration = 0;\r\n }\r\n\r\n play()\r\n {\r\n this.playing = true;\r\n }\r\n\r\n stop()\r\n {\r\n this.playing = false;\r\n }\r\n\r\n reset()\r\n {\r\n this.elapsed_time = -0.00001;\r\n }\r\n\r\n skip()\r\n {\r\n this.elapsed_time = this.get_duration();\r\n this.__play_clips(this.elapsed_time, this.elapsed_time + 0.01);\r\n }\r\n\r\n update(delta_time)\r\n {\r\n if (this.playing)\r\n {\r\n this.elapsed_time = this.elapsed_time + delta_time;\r\n this.__play_clips(this.elapsed_time, this.elapsed_time + delta_time);\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return TMath.clamp(this.elapsed_time / this.get_duration(), 0, 1);\r\n }\r\n\r\n is_finished()\r\n {\r\n return this.elapsed_time > this.get_duration();\r\n }\r\n\r\n add_action_event(trigger_time, action)\r\n {\r\n this.action_events.push({\r\n trigger_time: trigger_time,\r\n action: action\r\n });\r\n }\r\n\r\n add_action_interpolator(from, to, interpolator, use_dynamic_from_value = false)\r\n {\r\n if (use_dynamic_from_value)\r\n {\r\n let keyframes = this.channels[interpolator.attribute_name];\r\n\r\n if (keyframes === undefined)\r\n {\r\n console.error(`${interpolator.attribute_name} missing in initial state data.`);\r\n }\r\n\r\n if (keyframes.length === 0)\r\n {\r\n interpolator.from = this.initial_context[interpolator.attribute_name];\r\n }\r\n else\r\n {\r\n interpolator.from = keyframes[keyframes.length - 1].interpolator.to;\r\n }\r\n }\r\n\r\n let keyframe = {\r\n from: from,\r\n to: to,\r\n interpolator: interpolator\r\n };\r\n\r\n this.duration = Math.max(this.duration, to);\r\n this.channels[interpolator.attribute_name].push(keyframe);\r\n }\r\n\r\n get_property_target_value(name)\r\n {\r\n let keyframe = this.__get_nearest_keyframe(name, this.elapsed_time);\r\n\r\n if (this.elapsed_time < keyframe.from)\r\n {\r\n return keyframe.interpolator.evaluate(0);\r\n }\r\n\r\n return keyframe.interpolator.evaluate(1);\r\n }\r\n\r\n get_duration()\r\n {\r\n return this.duration;\r\n }\r\n\r\n __play_clips(from, to)\r\n {\r\n for (let i = 0; i < this.action_events.length; i++)\r\n {\r\n if (this.action_events[i].trigger_time >= from &&\r\n this.action_events[i].trigger_time < to)\r\n {\r\n // console.log(\"Play event: \" + this.action_events[i].action.constructor.name + \" at \"+ this.action_events[i].trigger_time);\r\n this.action_events[i].action.trigger(this.context);\r\n }\r\n }\r\n let channel_names = Object.keys(this.initial_context);\r\n\r\n for (let i = 0; i < channel_names.length; i++)\r\n {\r\n let name = channel_names[i];\r\n let keyframe = this.__get_nearest_keyframe(name, from);\r\n this.context[name] = this.evaluate_keyframe(keyframe, from);\r\n }\r\n }\r\n\r\n evaluate_keyframe(keyframe, time)\r\n {\r\n this.tmp_t = this.__linear_map_01(time, keyframe.from, keyframe.to);\r\n return keyframe.interpolator.evaluate(TMath.clamp(this.tmp_t, 0, 1));\r\n }\r\n\r\n __linear_map_01(value,\r\n from_range_start_value,\r\n from_range_end_value)\r\n {\r\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (1 - 0) + 0;\r\n }\r\n\r\n __get_nearest_keyframe(channel_name, time)\r\n {\r\n let closest = undefined;\r\n let min_time = 9999999;\r\n let keyframes = this.channels[channel_name];\r\n for (let i = 0; i < keyframes.length; i++)\r\n {\r\n let keyframe = keyframes[i];\r\n let difference = Math.min(\r\n Math.abs(keyframe.from - time),\r\n Math.abs(keyframe.to - time)\r\n );\r\n\r\n if (difference < min_time)\r\n {\r\n min_time = difference;\r\n closest = keyframe;\r\n }\r\n }\r\n return closest;\r\n }\r\n}\r\n","class EasingFunctions\r\n{\r\n constructor()\r\n { }\r\n\r\n linear(x)\r\n {\r\n return x;\r\n }\r\n\r\n triangular(x)\r\n {\r\n return 1 - Math.abs((x * 2) % (1 * 2) - 1);\r\n }\r\n\r\n ease_in_sine(x)\r\n {\r\n return 1 - Math.cos(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_out_sine(x)\r\n {\r\n return Math.sin(x * 3.1415926 / 2);\r\n }\r\n\r\n ease_in_out_sine(x)\r\n {\r\n return -(Math.cos(3.1415926 * x) - 1) / 2;\r\n }\r\n\r\n ease_in_cubic(x)\r\n {\r\n return x * x * x;\r\n }\r\n\r\n ease_out_cubic(x)\r\n {\r\n return 1 - Math.pow(1 - x, 3);\r\n }\r\n\r\n ease_in_out_cubic(x)\r\n {\r\n return x < 0.5\r\n ? 4 * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 3) / 2;\r\n }\r\n\r\n ease_in_quad(x)\r\n {\r\n return x * x;\r\n }\r\n\r\n ease_out_quad(x)\r\n {\r\n return 1 - (1 - x) * (1 - x);\r\n }\r\n\r\n ease_in_out_quad(x)\r\n {\r\n return x < 0.5\r\n ? 2 * x * x\r\n : 1 - Math.pow(-2 * x + 2, 2) / 2;\r\n }\r\n\r\n ease_in_quart(x)\r\n {\r\n return x * x * x * x;\r\n }\r\n\r\n ease_out_quart(x)\r\n {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n\r\n ease_in_out_quart(x)\r\n {\r\n return x < 0.5\r\n ? 8 * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 4) / 2;\r\n }\r\n\r\n ease_in_quint(x)\r\n {\r\n return x * x * x * x * x;\r\n }\r\n\r\n ease_out_quint(x)\r\n {\r\n return 1 - Math.pow(1 - x, 5);\r\n }\r\n\r\n ease_in_out_quint(x)\r\n {\r\n return x < 0.5\r\n ? 16 * x * x * x * x * x\r\n : 1 - Math.pow(-2 * x + 2, 5) / 2;\r\n }\r\n\r\n ease_in_expo(x)\r\n {\r\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\r\n }\r\n\r\n ease_out_expo(x)\r\n {\r\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\r\n }\r\n\r\n ease_in_out_expo(x)\r\n {\r\n return x === 0 ? 0 : x === 1 ? 1 : x < 0.5\r\n ? Math.pow(2, 20 * x - 10) / 2\r\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\r\n }\r\n\r\n ease_in_circ(x)\r\n {\r\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\r\n }\r\n\r\n ease_out_circ(x)\r\n {\r\n return Math.sqrt(1 - Math.pow(x - 1, 2));\r\n }\r\n\r\n ease_in_out_circ(x)\r\n {\r\n return x < 0.5\r\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\r\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\r\n }\r\n\r\n ease_in_back(x)\r\n {\r\n return 2.7015 * x * x * x - 1.7015 * x * x;\r\n }\r\n\r\n ease_out_back(x)\r\n {\r\n return 1 + 2.7015 * Math.pow(x - 1, 3) + 1.7015 * Math.pow(x - 1, 2);\r\n }\r\n\r\n ease_in_out_back(x)\r\n {\r\n return x < 0.5\r\n ? (Math.pow(2 * x, 2) * ((2.5949095 + 1) * 2 * x - 2.5949095)) / 2\r\n : (Math.pow(2 * x - 2, 2) * ((2.5949095 + 1) * (x * 2 - 2) + 2.5949095) + 2) / 2;\r\n }\r\n\r\n ease_in_elastic(x)\r\n {\r\n const c4 = (2 * Math.PI) / 3;\r\n\r\n return x === 0\r\n ? 0\r\n : x === 1\r\n ? 1\r\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\r\n }\r\n\r\n ease_out_elastic(x)\r\n {\r\n return x === 0 ? 0 : x === 1 ? 1\r\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * 2.0943950) + 1;\r\n }\r\n\r\n ease_in_out_elastic(x)\r\n {\r\n return x === 0 ? 0 : x === 1 ? 1 : x < 0.5\r\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * 1.3962633)) / 2\r\n : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * 1.3962633) / 2 + 1;\r\n }\r\n\r\n ease_in_bounce(x)\r\n {\r\n return 1 - this.ease_out_bounce(1 - x);\r\n }\r\n\r\n ease_out_bounce(x)\r\n {\r\n const n1 = 7.5625;\r\n const d1 = 2.75;\r\n\r\n if (x < 1 / d1)\r\n {\r\n return n1 * x * x;\r\n }\r\n else if (x < 2 / d1)\r\n {\r\n return n1 * (x -= 1.5 / d1) * x + 0.75;\r\n }\r\n else if (x < 2.5 / d1)\r\n {\r\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\r\n }\r\n else\r\n {\r\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\r\n }\r\n }\r\n\r\n ease_in_out_bounce(x)\r\n {\r\n return x < 0.5\r\n ? (1 - this.ease_out_bounce(1 - 2 * x)) / 2\r\n : (1 + this.ease_out_bounce(2 * x - 1)) / 2;\r\n }\r\n\r\n heartbeat(t)\r\n {\r\n return 1.0 - Math.pow(Math.abs(Math.sin(t + 1.0)), 63.0) * Math.sign(Math.sin(t)) * Math.sin(t + 1.5 + 1.0) * 0.8;\r\n }\r\n}\r\n\r\nexport default new EasingFunctions();\r\n","import EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class ActionInterpolator\r\n{\r\n constructor(easing_function = 'linear')\r\n {\r\n this.easing_function = undefined;\r\n\r\n if (typeof easing_function === 'string')\r\n {\r\n this.easing_function = EasingFunctions[easing_function];\r\n }\r\n else\r\n {\r\n this.easing_function = easing_function;\r\n }\r\n }\r\n\r\n update(context, t)\r\n {\r\n\r\n }\r\n}\r\n","import ActionInterpolator from './ActionInterpolator';\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class NumberInterpolator extends ActionInterpolator\r\n{\r\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n }\r\n\r\n update(context, t)\r\n {\r\n context[this.attribute_name] = TMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n\r\n evaluate(t)\r\n {\r\n return TMath.lerp(this.from, this.to, this.easing_function(t));\r\n }\r\n}\r\n","import ActionSequencer from '../../action_sequencer/ActionSequencer';\r\nimport NumberInterpolator from '../../action_sequencer/NumberInterpolator';\r\n\r\nexport default class ActionSequencerBuilder\r\n{\r\n constructor(initial_state_data)\r\n {\r\n this.initial_state_data = initial_state_data;\r\n }\r\n\r\n from_animation_sheet(tracks, current_context)\r\n {\r\n let initial_tracks = this.state_to_tracks(this.initial_state_data);\r\n\r\n for (let i = 0; i < initial_tracks.length; i++)\r\n {\r\n if (tracks.find(element => element.attribute_name === initial_tracks[i].attribute_name) === undefined)\r\n {\r\n tracks.push(initial_tracks[i]);\r\n }\r\n }\r\n\r\n let sequencer = new ActionSequencer(current_context);\r\n\r\n for (let i = 0; i < tracks.length; i++)\r\n {\r\n let t = tracks[i];\r\n let interpolator = new NumberInterpolator(t.attribute_name, current_context[t.attribute_name], t.to_value, t.easing_function);\r\n sequencer.add_action_interpolator(t.from_time, t.to_time, interpolator, true);\r\n }\r\n\r\n return sequencer;\r\n }\r\n\r\n state_to_tracks(state)\r\n {\r\n let tracks = [];\r\n\r\n let keys = Object.keys(state);\r\n\r\n for (let i = 0; i < keys.length; i++)\r\n {\r\n tracks.push({\r\n attribute_name: keys[i],\r\n from_time: 0,\r\n to_time: 1,\r\n to_value: state[keys[i]],\r\n easing_function: 'ease_in_out_cubic'\r\n });\r\n }\r\n\r\n return tracks;\r\n }\r\n}\r\n","class EventManager\r\n{\r\n init()\r\n {\r\n this.queue = {};\r\n\r\n this.zoom_changed_evt = 'zoom_changed';\r\n this.store_clickd_evt = 'store_clicked';\r\n this.point_selected_evt = 'point_selected';\r\n this.config_changed = 'config_changed';\r\n\r\n this.path_substep_completed = 'path_substep_completed';\r\n this.path_completed = 'path_completed';\r\n this.go_to_store_requested_evt = 'go_to_store_requested';\r\n\r\n this.resource_loaded_evt = 'resource_loaded';\r\n this.service_clicked_evt = 'service_clicked';\r\n this.unit_pos_updated_evt = 'unit_position_updated';\r\n\r\n this.floor_changed_evt = 'floor_changed';\r\n\r\n this.on_enter_floor_navigation = 'on_enter_floor_navigation';\r\n this.on_exit_floor_navigation = 'on_exit_floor_navigation';\r\n\r\n this.on_enter_floor_selection = 'on_enter_floor_selection';\r\n this.on_exit_floor_selection = 'on_exit_floor_selection';\r\n\r\n this.on_enter_outside_navigation = 'on_enter_outside_navigation';\r\n this.on_exit_outside_navigation = 'on_exit_outside_navigation';\r\n\r\n this.step_selected_evt = 'step_selected';\r\n }\r\n\r\n fire(event, payload)\r\n {\r\n let queue = this.queue[event];\r\n\r\n if (queue === undefined)\r\n {\r\n return;\r\n }\r\n let i = queue.length;\r\n while (i--)\r\n {\r\n queue[i](payload);\r\n }\r\n }\r\n\r\n on(event, callback)\r\n {\r\n if (typeof this.queue[event] === 'undefined')\r\n {\r\n this.queue[event] = [];\r\n }\r\n\r\n this.queue[event].push(callback);\r\n }\r\n\r\n fire_zoom_changed(zoom)\r\n {\r\n this.fire(this.zoom_changed_evt, zoom);\r\n }\r\n\r\n fire_store_selected(store_id)\r\n {\r\n this.fire(this.store_clickd_evt, store_id);\r\n }\r\n\r\n fire_point_selected(hit_data)\r\n {\r\n this.fire(this.point_selected_evt, hit_data);\r\n }\r\n\r\n fire_config_changed()\r\n {\r\n this.fire(this.config_changed);\r\n }\r\n\r\n fire_path_substep_completed(step_number)\r\n {\r\n this.fire(this.path_substep_completed, step_number);\r\n }\r\n\r\n fire_path_completed()\r\n {\r\n this.fire(this.path_completed);\r\n }\r\n\r\n fire_step_selected(step_index)\r\n {\r\n this.fire(this.step_selected_evt, step_index);\r\n }\r\n\r\n fire_go_to_store_requested(store_id)\r\n {\r\n this.fire(this.go_to_store_requested_evt, store_id);\r\n }\r\n\r\n fire_resource_loaded(resource)\r\n {\r\n this.fire(this.resource_loaded_evt, resource);\r\n }\r\n\r\n fire_service_clicked(service)\r\n {\r\n this.fire(this.service_clicked_evt, service);\r\n }\r\n\r\n fire_unit_position_updated(unit_data)\r\n {\r\n this.fire(this.unit_pos_updated_evt, unit_data);\r\n }\r\n\r\n fire_floor_switched(floor_id)\r\n {\r\n this.fire(this.floor_changed_evt, floor_id);\r\n }\r\n\r\n fire_on_enter_floor_navigation(state)\r\n {\r\n this.fire(this.on_enter_floor_navigation, state);\r\n }\r\n\r\n fire_on_exit_floor_navigation(state)\r\n {\r\n this.fire(this.on_exit_floor_navigation, state);\r\n }\r\n\r\n fire_on_enter_floor_selection(state)\r\n {\r\n this.fire(this.on_enter_floor_selection, state);\r\n }\r\n\r\n fire_on_exit_floor_selection(state)\r\n {\r\n this.fire(this.on_exit_floor_selection, state);\r\n }\r\n\r\n fire_on_enter_outside_navigation(state)\r\n {\r\n this.fire(this.on_enter_outside_navigation, state);\r\n }\r\n\r\n fire_on_exit_outside_navigation(state)\r\n {\r\n this.fire(this.on_exit_outside_navigation, state);\r\n }\r\n}\r\n\r\nexport default new EventManager();\r\n","import EventManager from './EventManager';\r\n\r\nclass ResourceContainer\r\n{\r\n init()\r\n {\r\n this.resources = {};\r\n }\r\n\r\n set_resource(name, resource)\r\n {\r\n this.resources[name] = resource;\r\n EventManager.fire_resource_loaded({ name: name, value: resource });\r\n }\r\n\r\n get_resource(name)\r\n {\r\n return this.resources[name];\r\n }\r\n\r\n get(name)\r\n {\r\n return this.resources[name];\r\n }\r\n}\r\n\r\nexport default new ResourceContainer();\r\n","export default class DrawIOAnimationSheet\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n parse(xml_document)\r\n {\r\n let doc = new DOMParser().parseFromString(xml_document, 'text/xml');\r\n\r\n let animation_nodes = doc.querySelectorAll('mxGeometry');\r\n\r\n let animation_tracks = [];\r\n\r\n for (let i = 0; i < animation_nodes.length; i++)\r\n {\r\n let node = animation_nodes[i];\r\n\r\n let x_pos = node.getAttribute('x');\r\n x_pos = x_pos === null ? 0 : parseFloat(x_pos);\r\n\r\n let from = x_pos / 100;\r\n let to = from + parseFloat(node.getAttribute('width')) / 100;\r\n\r\n let parent_node = node.parentElement;\r\n\r\n let data = parent_node.getAttribute('value');\r\n\r\n let valid_element = parent_node.getAttribute('style').includes('rounded=0;') &&\r\n !parent_node.getAttribute('style').includes('text;');\r\n\r\n if (valid_element && data !== '' && !data.includes(' '))\r\n {\r\n let split_data = data.split('=');\r\n\r\n let attribute_name = split_data[0];\r\n\r\n let value_data = split_data[1].split('--');\r\n let to_value = parseFloat(value_data[0]);\r\n let easing_function = value_data[1];\r\n\r\n if (split_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n if (value_data.length !== 2)\r\n {\r\n console.error('DrawIO data is malformed:', data);\r\n }\r\n\r\n animation_tracks.push({\r\n attribute_name: attribute_name,\r\n from_time: from,\r\n to_time: to,\r\n to_value: to_value,\r\n easing_function: easing_function\r\n });\r\n }\r\n }\r\n\r\n animation_tracks.sort((a, b) =>\r\n {\r\n return a.from_time - b.from_time;\r\n });\r\n\r\n return animation_tracks;\r\n }\r\n}\r\n","import ActionSequencerBuilder from './ActionSequencerBuilder';\r\n\r\nexport default class TransitionTable\r\n{\r\n constructor()\r\n {\r\n this.transitions = [];\r\n this.initial_state_data = {};\r\n }\r\n\r\n get(to_state, current_context)\r\n {\r\n for (let i = 0; i < this.transitions.length; i++)\r\n {\r\n if (this.transitions[i].to === to_state)\r\n {\r\n let action_sequencer = new ActionSequencerBuilder(this.initial_state_data).from_animation_sheet(this.transitions[i].data, current_context);\r\n\r\n return action_sequencer;\r\n }\r\n }\r\n\r\n console.error('TransitionTable.get no data found for: ', to_state);\r\n return undefined;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n for (let i = 0; i < transitions.length; i++)\r\n {\r\n this.transitions.push(transitions[i]);\r\n }\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transitions = transitions;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n this.initial_state_data = initial_state_data;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\nimport { Clock } from 'three';\r\n\r\nclass Time\r\n{\r\n init()\r\n {\r\n this.___time = new Clock();\r\n this.__delta_time = 0;\r\n this.__elapsed_time = 0;\r\n this.__allocated_time = new Vector2(0, 0);\r\n }\r\n\r\n get delta_time()\r\n {\r\n return this.__delta_time < 0.4 ? this.__delta_time : 0.016;\r\n }\r\n\r\n get elapsed_time()\r\n {\r\n return this.__elapsed_time;\r\n }\r\n\r\n get shader_time()\r\n {\r\n this.__allocated_time.x = this.delta_time;\r\n this.__allocated_time.y = this.elapsed_time;\r\n return this.__allocated_time;\r\n }\r\n\r\n __update()\r\n {\r\n this.__delta_time = this.___time.getDelta();\r\n this.__elapsed_time = this.___time.getElapsedTime();\r\n }\r\n}\r\n\r\nexport default new Time();\r\n","export default class ViewState\r\n{\r\n constructor(name)\r\n {\r\n this.name = name;\r\n }\r\n\r\n start()\r\n {\r\n }\r\n\r\n show()\r\n {\r\n }\r\n\r\n hide()\r\n {\r\n }\r\n\r\n before_enter()\r\n {\r\n }\r\n\r\n on_enter()\r\n {\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n update_enter_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n // Backward compatibility. It will be removed in future releases.\r\n this.update_transition(global_view_data, transition_progress, action_sequencer);\r\n }\r\n\r\n update_exit_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n // Deprecated\r\n update_transition(global_view_data, transition_progress, action_sequencer)\r\n {\r\n }\r\n\r\n before_exit()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n }\r\n}\r\n","import Time from '../../Time';\r\nimport ViewState from '../ViewState';\r\n\r\nexport default class ViewStateTransitionHandler\r\n{\r\n constructor(transition_table)\r\n {\r\n this.last_state = new ViewState();\r\n this.current_state = new ViewState();\r\n\r\n this.initial_state_data = {};\r\n this.current_state_data = {};\r\n\r\n this.transition_table = transition_table;\r\n\r\n this.transitioning = false;\r\n }\r\n\r\n go_to_state(state, skip = false)\r\n {\r\n this.last_state = this.current_state;\r\n this.current_state = state;\r\n\r\n this.last_state.before_exit();\r\n this.current_state.show();\r\n this.current_state.before_enter();\r\n\r\n this.action_sequencer = this.transition_table.get(this.current_state.name, this.current_state_data);\r\n this.action_sequencer.play();\r\n\r\n this.transitioning = true;\r\n\r\n if (skip)\r\n {\r\n this.action_sequencer.skip();\r\n this.update();\r\n }\r\n }\r\n\r\n update()\r\n {\r\n if (this.transitioning)\r\n {\r\n this.action_sequencer.update(Time.delta_time);\r\n this.last_state.update_exit_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n this.current_state.update_enter_transition(this.current_state_data, this.action_sequencer.get_progress(), this.action_sequencer);\r\n\r\n if (this.action_sequencer.is_finished())\r\n {\r\n this.transitioning = false;\r\n\r\n if (this.last_state.name !== this.current_state.name)\r\n {\r\n this.last_state.hide();\r\n }\r\n\r\n this.last_state.on_exit();\r\n this.current_state.on_enter();\r\n }\r\n }\r\n else\r\n {\r\n this.current_state.update();\r\n }\r\n }\r\n\r\n set_state(state)\r\n {\r\n this.current_state = state;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n Object.assign(this.initial_state_data, initial_state_data);\r\n Object.assign(this.current_state_data, initial_state_data);\r\n }\r\n}\r\n","import TransitionTable from './transition/TransitionTable';\r\nimport ViewStateTransitionHandler from './transition/ViewStateTransitionHandler';\r\n\r\nclass ViewManager\r\n{\r\n constructor()\r\n {\r\n this.views = [];\r\n\r\n this.transition_table = new TransitionTable();\r\n this.transition_handler = new ViewStateTransitionHandler(this.transition_table);\r\n }\r\n\r\n update()\r\n {\r\n this.transition_handler.update();\r\n }\r\n\r\n go_to_view(view_name, change_url = true, skip = false)\r\n {\r\n let v = this.get_view_by_name(view_name);\r\n this.transition_handler.go_to_state(v, skip);\r\n\r\n if (change_url)\r\n {\r\n this.__change_browser_url(v.url);\r\n }\r\n }\r\n\r\n register_view(view)\r\n {\r\n this.views.push(view);\r\n }\r\n\r\n has_view(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n add_transitions(transitions)\r\n {\r\n this.transition_table.add_transitions(transitions);\r\n }\r\n\r\n set_transitions(transitions)\r\n {\r\n this.transition_table.set_transitions(transitions);\r\n }\r\n\r\n set_view(view_name)\r\n {\r\n let view = this.get_view_by_name(view_name);\r\n\r\n this.transition_handler.set_state(view);\r\n }\r\n\r\n get_current_view()\r\n {\r\n return this.transition_handler.current_state;\r\n }\r\n\r\n get_view_by_name(view_name)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].name === view_name)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('get_view_by_name no view found for: ', view_name);\r\n return undefined;\r\n }\r\n\r\n get_view_by_url(url)\r\n {\r\n for (let i = 0; i < this.views.length; i++)\r\n {\r\n if (this.views[i].url === url)\r\n {\r\n return this.views[i];\r\n }\r\n }\r\n console.error('get_view_by_name no view found for: ', url);\r\n return undefined;\r\n }\r\n\r\n set_initial_state_data(initial_state_data)\r\n {\r\n this.transition_table.set_initial_state_data(initial_state_data);\r\n this.transition_handler.set_initial_state_data(initial_state_data);\r\n }\r\n\r\n __change_browser_url(url)\r\n {\r\n window.history.pushState('', '', url);\r\n }\r\n}\r\n\r\nexport default new ViewManager();\r\n","import ResourceContainer from '../ResourceContainer';\r\nimport DrawIOAnimationSheet from './transition/DrawIOAnimationSheet';\r\nimport ViewManager from './ViewManager';\r\nimport ViewState from './ViewState';\r\n\r\nexport default class ApplicationView extends ViewState\r\n{\r\n constructor({ name, url, container })\r\n {\r\n super(name);\r\n\r\n this.container = container;\r\n this.url = url;\r\n\r\n let transitions = [\r\n {\r\n to: name,\r\n data: new DrawIOAnimationSheet().parse(ResourceContainer.get(`${name}_data`))\r\n }\r\n ];\r\n\r\n ViewManager.register_view(this);\r\n ViewManager.add_transitions(transitions);\r\n }\r\n\r\n show()\r\n {\r\n this.container.classList.add('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n before_exit()\r\n {\r\n this.container.classList.add('before_exit');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n hide()\r\n {\r\n this.container.classList.add('hidden');\r\n this.container.classList.remove('before_enter');\r\n this.container.classList.remove('before_exit');\r\n }\r\n\r\n set_opacity(opacity)\r\n {\r\n this.container.style.opacity = opacity;\r\n }\r\n}\r\n","export default class BaseApplication\r\n{\r\n on_post_start()\r\n {}\r\n\r\n on_enter()\r\n {}\r\n\r\n on_exit()\r\n {}\r\n\r\n update()\r\n {}\r\n\r\n on_post_render()\r\n {}\r\n\r\n on_pre_render()\r\n {}\r\n}\r\n","export default class BaseRender\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n render()\r\n {\r\n\r\n }\r\n\r\n on_enter(context, renderer)\r\n {\r\n\r\n }\r\n\r\n on_exit(context, renderer)\r\n {\r\n\r\n }\r\n\r\n resize()\r\n {\r\n\r\n }\r\n\r\n dispose()\r\n {\r\n\r\n }\r\n}\r\n","import basic_vert from '../shaders/basic_color/basic_color.vert';\r\nimport basic_frag from '../shaders/basic_color/basic_color.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nexport default class BaseShaderMaterial extends ShaderMaterial\r\n{\r\n constructor(vert, frag, uniforms)\r\n {\r\n super({\r\n vertexShader: vert || basic_vert,\r\n fragmentShader: frag || basic_frag,\r\n uniforms: uniforms || {\r\n _Color: { value: new Color('#FF0000') }\r\n }\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { sRGBEncoding } from 'three';\r\n\r\nexport default class BasisLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, renderer, loader, size)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.loader = loader;\r\n\r\n this.loader.setWorkerLimit(1);\r\n\r\n this.loader.setTranscoderPath(\r\n 'libs/basis/'\r\n );\r\n\r\n this.loader.detectSupport(renderer);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (basis) =>\r\n {\r\n basis.encoding = sRGBEncoding;\r\n\r\n resource_container.set_resource(ctx.resource_id, basis);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import vert from '../shaders/copy/copy.vert';\r\nimport frag from '../shaders/copy/copy.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { NoBlending } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\n\r\nexport default class BlitMaterial extends ShaderMaterial\r\n{\r\n constructor(frag_shader, vert_shader, defines)\r\n {\r\n super({\r\n uniforms: {\r\n _MainTex: { value: null },\r\n _Resolution: { value: new Vector2(0, 0) },\r\n _TargetResolution: { value: new Vector2(0, 0) }\r\n },\r\n defines: defines || {},\r\n vertexShader: vert_shader || vert,\r\n fragmentShader: frag_shader || frag,\r\n depthWrite: false,\r\n blending: NoBlending,\r\n depthTest: false,\r\n depthFunc: AlwaysDepth\r\n });\r\n }\r\n}\r\n","class CameraManager\r\n{\r\n init()\r\n {\r\n this._current = undefined;\r\n }\r\n\r\n set current(camera)\r\n {\r\n this._current = camera;\r\n }\r\n\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n}\r\n\r\nexport default new CameraManager();\r\n","class Capabilities\r\n{\r\n init()\r\n {\r\n this.max_anisotropy = 0;\r\n this.vertex_texture_sampler_available = false;\r\n this.fp_textures_available = false;\r\n }\r\n}\r\n\r\nexport default new Capabilities();\r\n","import { CanvasTexture } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { UVMapping } from 'three';\r\nimport { ClampToEdgeWrapping } from 'three';\r\nimport { NearestFilter } from 'three';\r\n\r\nexport default class CanvasDrawer\r\n{\r\n constructor(uses_dynamic_font)\r\n {\r\n this.uses_dynamic_font = uses_dynamic_font;\r\n this.__textHeight = null;\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.ctx = this.canvas.getContext('2d');\r\n }\r\n\r\n getFontHeight(fontStyle = 'Arial')\r\n {\r\n if (this.__textHeight == null || this.uses_dynamic_font)\r\n {\r\n let body = document.getElementsByTagName('body')[0];\r\n let dummy = document.createElement('div');\r\n let dummyText = document.createTextNode('MÉqgOLAKTAL');\r\n dummy.appendChild(dummyText);\r\n dummy.setAttribute('style', `font:${fontStyle};position:absolute;top:0;left:0`);\r\n body.appendChild(dummy);\r\n this.__textHeight = dummy.offsetHeight;\r\n body.removeChild(dummy);\r\n }\r\n return this.__textHeight;\r\n }\r\n\r\n get_text_size(text, font = '24px Arial')\r\n {\r\n let size = new Vector2();\r\n this.ctx.font = font;\r\n size.x = Math.ceil(this.ctx.measureText(text).width);\r\n size.y = Math.ceil(this.getFontHeight(font));\r\n return size;\r\n }\r\n\r\n draw_canvas(text, ctxOptions = {})\r\n {\r\n ctxOptions.font = ctxOptions.font || '24px Arial';\r\n ctxOptions.font_color = ctxOptions.font_color || '#000000';\r\n\r\n this.__draw(text, ctxOptions, this.canvas, this.ctx);\r\n return this.canvas;\r\n }\r\n\r\n draw_on_texture(text, ctxOptions)\r\n {\r\n let canvas = this.draw_canvas(text, ctxOptions);\r\n let canvas_texture = new CanvasTexture(canvas, UVMapping,\r\n ClampToEdgeWrapping,\r\n ClampToEdgeWrapping,\r\n NearestFilter,\r\n NearestFilter);\r\n canvas_texture.generateMipMaps = false;\r\n canvas_texture.needsUpdate = true;\r\n\r\n return canvas_texture;\r\n }\r\n\r\n __draw(text, ctxOptions)\r\n {}\r\n\r\n roundRect(ctx, x, y, width, height, radius, fill, stroke)\r\n {\r\n if (typeof stroke === 'undefined')\r\n {\r\n stroke = true;\r\n }\r\n if (typeof radius === 'undefined')\r\n {\r\n radius = 5;\r\n }\r\n if (typeof radius === 'number')\r\n {\r\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\r\n }\r\n else\r\n {\r\n let defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (let side in defaultRadius)\r\n {\r\n radius[side] = radius[side] || defaultRadius[side];\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius.tl, y);\r\n ctx.lineTo(x + width - radius.tr, y);\r\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\r\n ctx.lineTo(x + width, y + height - radius.br);\r\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\r\n ctx.lineTo(x + radius.bl, y + height);\r\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\r\n ctx.lineTo(x, y + radius.tl);\r\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\r\n ctx.closePath();\r\n if (fill)\r\n {\r\n ctx.fill();\r\n }\r\n if (stroke)\r\n {\r\n ctx.stroke();\r\n }\r\n }\r\n}\r\n","/*\r\n\r\n A configuration class used as a singleton\r\n\r\n*/\r\n\r\nclass Configuration\r\n{\r\n init(parameters = {})\r\n {\r\n this.dpr = 1;\r\n\r\n this.app = {}; // for arbitrary use in end application\r\n }\r\n\r\n from_json(json)\r\n {\r\n\r\n }\r\n}\r\n\r\nexport default new Configuration();\r\n","export default class Idle\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n get is_animating()\r\n {\r\n return false;\r\n }\r\n\r\n on_enter(view)\r\n {\r\n\r\n }\r\n\r\n update(view)\r\n {\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n","import Time from '../../Time';\r\nimport Idle from './Idle';\r\n\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class Animating\r\n{\r\n constructor()\r\n {\r\n this.t = 0;\r\n this.easing_function_t = 0;\r\n }\r\n\r\n get is_animating()\r\n {\r\n return true;\r\n }\r\n\r\n on_enter(animator)\r\n {\r\n }\r\n\r\n update(animator)\r\n {\r\n this.t += Time.delta_time / animator.duration;\r\n\r\n this.easing_function_t = animator.easing_function(this.t);\r\n this.easing_function_t = TMath.clamp(this.easing_function_t, 0, 1);\r\n\r\n animator.set_property_value(TMath.lerp(animator.from, animator.to, this.easing_function_t));\r\n\r\n if (this.easing_function_t >= 0.9999)\r\n {\r\n animator.set_property_value(animator.to);\r\n\r\n animator.set_current_state(new Idle());\r\n animator.finished_callback(animator);\r\n }\r\n }\r\n\r\n on_exit(view)\r\n {\r\n\r\n }\r\n}\r\n","import Animating from './css_animator_states/Animating';\r\nimport Idle from './css_animator_states/Idle';\r\nimport EasingFunctions from '../utilities/EasingFunctions';\r\n\r\nexport default class CSSAnimator\r\n{\r\n constructor({\r\n element,\r\n css_property,\r\n from = 0,\r\n to = 1,\r\n duration = 1,\r\n value_prefix = '',\r\n value_suffix = '',\r\n easing_function = EasingFunctions.ease_in_out_cubic,\r\n finished_callback = () =>\r\n {}\r\n })\r\n {\r\n this.element = element;\r\n this.css_property = css_property;\r\n this.from = from;\r\n this.to = to;\r\n this.value_prefix = value_prefix;\r\n this.value_suffix = value_suffix;\r\n this.duration = duration;\r\n this.easing_function = easing_function;\r\n this.finished_callback = finished_callback;\r\n\r\n this.current_state = new Idle();\r\n }\r\n\r\n animate()\r\n {\r\n this.set_current_state(new Animating());\r\n }\r\n\r\n stop()\r\n {\r\n this.set_current_state(new Idle());\r\n }\r\n\r\n set_property_value(value)\r\n {\r\n this.element.style[this.css_property] = `${this.value_prefix}${value}${this.value_suffix}`;\r\n }\r\n\r\n update()\r\n {\r\n this.current_state.update(this);\r\n }\r\n\r\n get is_animating()\r\n {\r\n return this.current_state.is_animating;\r\n }\r\n\r\n set_current_state(state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = state;\r\n this.current_state.on_enter(this);\r\n }\r\n}\r\n","\r\nimport { Object3D } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { AlwaysDepth } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { Line } from 'three';\r\n\r\nexport default class AxisHelper extends Object3D\r\n{\r\n constructor(scale = 1.0)\r\n {\r\n super();\r\n\r\n const blue_points = [];\r\n blue_points.push(new Vector3(0, 0, 0));\r\n blue_points.push(new Vector3(0, 0, 1000));\r\n\r\n const blue_axis_mat = new LineBasicMaterial({ color: 0x4444ff, depthFunc: AlwaysDepth });\r\n const blue_axis_geo = new BufferGeometry().setFromPoints(blue_points);\r\n const blue_axis_line = new Line(blue_axis_geo, blue_axis_mat);\r\n blue_axis_line.renderOrder = 50000;\r\n\r\n const green_points = [];\r\n green_points.push(new Vector3(0, 0, 0));\r\n green_points.push(new Vector3(0, 1000, 0));\r\n\r\n const green_axis_mat = new LineBasicMaterial({ color: 0x44ff44, depthFunc: AlwaysDepth });\r\n const green_axis_geo = new BufferGeometry().setFromPoints(green_points);\r\n const green_axis_line = new Line(green_axis_geo, green_axis_mat);\r\n green_axis_line.renderOrder = 50000;\r\n\r\n const red_points = [];\r\n red_points.push(new Vector3(0, 0, 0));\r\n red_points.push(new Vector3(1000, 0, 0));\r\n\r\n const red_axis_mat = new LineBasicMaterial({ color: 0xff4444, depthFunc: AlwaysDepth });\r\n const red_axis_geo = new BufferGeometry().setFromPoints(red_points);\r\n const red_axis_line = new Line(red_axis_geo, red_axis_mat);\r\n red_axis_line.renderOrder = 50000;\r\n\r\n this.renderOrder = 100000;\r\n\r\n this.add(blue_axis_line);\r\n this.add(green_axis_line);\r\n this.add(red_axis_line);\r\n\r\n this.scale.set(scale, scale, scale);\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n dispose()\r\n {\r\n }\r\n}\r\n","import { Scene } from 'three';\r\n\r\nclass SceneManager\r\n{\r\n init()\r\n {\r\n this._current = new Scene();\r\n this._current.name = 'default_scene';\r\n }\r\n\r\n add_scene(name)\r\n {\r\n\r\n }\r\n\r\n get current()\r\n {\r\n return this._current;\r\n }\r\n\r\n set current(scene)\r\n {\r\n this._current = scene;\r\n }\r\n\r\n dispose()\r\n {\r\n this.current.traverse(child =>\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry.dispose();\r\n child.material.dispose();\r\n }\r\n });\r\n\r\n while (this.current.children.length > 0)\r\n {\r\n this.current.remove(this.current.children[0]);\r\n }\r\n }\r\n}\r\n\r\nexport default new SceneManager();\r\n","\r\nimport { Vector3, Mesh } from 'three';\r\nimport { BoxGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Cube extends Mesh\r\n{\r\n constructor(size, segments, color)\r\n {\r\n size = size || new Vector3(1, 1, 1);\r\n segments = segments || new Vector3(1, 1, 1);\r\n color = color || 0xff0000;\r\n let geometry = new BoxGeometry(size.x, size.y, size.z, segments.x, segments.y, segments.z);\r\n let material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { SphereBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class Sphere extends Mesh\r\n{\r\n constructor(radius, color)\r\n {\r\n color = color || '#FF0000';\r\n radius = radius || 1;\r\n let geometry = new SphereBufferGeometry(radius, 64, 64);\r\n let material = new MeshBasicMaterial({ color: color });\r\n super(geometry, material);\r\n }\r\n}\r\n","import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { CylinderBufferGeometry } from 'three';\r\nimport { ConeBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { Vector3, Mesh } from 'three';\r\n\r\nexport default class Arrow extends Mesh\r\n{\r\n constructor(color, length, dir)\r\n {\r\n color = color || '#FF0000';\r\n length = length || 1;\r\n\r\n let cone_height = 0.4;\r\n let cylinder_height = length - cone_height;\r\n let cylinder_geo = new CylinderBufferGeometry(0.01, 0.01, cylinder_height, 32);\r\n cylinder_geo.translate(0, cylinder_height / 2, 0);\r\n\r\n let cone_geometry = new ConeBufferGeometry(0.1, cone_height, 32);\r\n cone_geometry.translate(0, cylinder_height + cone_height / 2, 0);\r\n\r\n let buffer_geometry = BufferGeometryUtils.mergeBufferGeometries([cylinder_geo, cone_geometry]);\r\n buffer_geometry.rotateX(3.14 / 2);\r\n\r\n let material = new MeshBasicMaterial({ color: color });\r\n super(buffer_geometry, material);\r\n\r\n if (dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n }\r\n\r\n this._dir = dir;\r\n }\r\n\r\n set dir(dir)\r\n {\r\n this.quaternion.setFromUnitVectors(new Vector3(0, 0, 1), dir);\r\n this._dir = dir;\r\n }\r\n\r\n get dir()\r\n {\r\n return this._dir;\r\n }\r\n\r\n set length(value)\r\n {\r\n this.scale.z = value;\r\n }\r\n\r\n get length()\r\n {\r\n return this.scale.z;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\n\r\nclass Screen\r\n{\r\n init()\r\n {\r\n this.width = 1;\r\n this.height = 1;\r\n\r\n this.position = new Vector2();\r\n\r\n this.render_width = 1;\r\n this.render_height = 1;\r\n this.width_height = new Vector2(this.width, this.height);\r\n\r\n this.dpr = 1;\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n }\r\n\r\n update_position(x, y)\r\n {\r\n this.position.set(x, y);\r\n }\r\n\r\n update_size(width, height)\r\n {\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.pixel_size = new Vector2(1 / this.width, 1 / this.height);\r\n\r\n this.width_height.x = width;\r\n this.width_height.y = height;\r\n\r\n this.render_width = width * this.dpr;\r\n this.render_height = height * this.dpr;\r\n }\r\n\r\n apply_pixel_density_v2(vector2)\r\n {\r\n vector2.multiplyScalar(1 / this.dpr);\r\n\r\n return vector2;\r\n }\r\n\r\n apply_pixel_density(value)\r\n {\r\n return value * (1 / this.dpr);\r\n }\r\n\r\n get_pixel_size()\r\n {\r\n return this.pixel_size;\r\n }\r\n\r\n get aspect_ratio()\r\n {\r\n return this.width / this.height;\r\n }\r\n}\r\n\r\nexport default new Screen();\r\n","import BaseShaderMaterial from './BaseShaderMaterial';\r\nimport { Vector2 } from 'three';\r\nexport default class ScreenSpaceTextureMaterial extends BaseShaderMaterial\r\n{\r\n constructor(x, y, w, h)\r\n {\r\n let vert = `\r\n uniform vec2 _ScreenSpacePosition;\r\n uniform vec2 _ScreenSize;\r\n uniform vec2 _TextureSize;\r\n varying vec2 vUv;\r\n void main()\r\n {\r\n vec2 pos = uv * vec2(_TextureSize.x / _ScreenSize.x, _TextureSize.y / _ScreenSize.y);\r\n pos += vec2(_ScreenSpacePosition.x / _ScreenSize.x, _ScreenSpacePosition.y / _ScreenSize.y);\r\n\r\n pos.x = pos.x * 2.0 - 1.0;\r\n pos.y = pos.y * 2.0 - 1.0;\r\n\r\n gl_Position = vec4(pos, 0.0, 1.0);\r\n vUv = uv;\r\n }\r\n `;\r\n let frag = `\r\n uniform sampler2D _MainTex;\r\n varying vec2 vUv;\r\n\r\n void main()\r\n {\r\n gl_FragColor = texture2D(_MainTex, vUv);\r\n }\r\n `;\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSpacePosition: { value: new Vector2() },\r\n _ScreenSize: { value: new Vector2() },\r\n _TextureSize: { value: new Vector2() }\r\n });\r\n }\r\n\r\n set_position(x, y)\r\n {\r\n this.uniforms._ScreenSpacePosition.value.set(x, y);\r\n }\r\n\r\n set_texture(tex, w, h)\r\n {\r\n this.uniforms._MainTex.value = tex;\r\n this.uniforms._TextureSize.value.set(tex.image.width, tex.image.height);\r\n\r\n if (w !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.x = w;\r\n }\r\n if (h !== undefined)\r\n {\r\n this.uniforms._TextureSize.value.y = h;\r\n }\r\n }\r\n\r\n set_screen_size(w, h)\r\n {\r\n this.uniforms._ScreenSize.value.set(w, h);\r\n }\r\n}\r\n","import AxisHelper from './components/AxisHelper';\r\nimport basic_color_vert from './shaders/basic_color/basic_color.vert';\r\nimport basic_color_frag from './shaders/basic_color/basic_color.frag';\r\nimport SceneManager from './SceneManager';\r\nimport Cube from './primitives/Cube';\r\nimport Sphere from './primitives/Sphere';\r\nimport Arrow from './primitives/Arrow';\r\nimport Screen from './Screen';\r\nimport ScreenSpaceTextureMaterial from './materials/ScreenSpaceTextureMaterial';\r\nimport { Vector3 } from 'three';\r\nimport { LineBasicMaterial } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Line } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Vector4 } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { Box3 } from 'three';\r\nimport { Box3Helper } from 'three';\r\nimport { CatmullRomCurve3 } from 'three';\r\nimport { SphereGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nclass Debug\r\n{\r\n init()\r\n {\r\n this.Vector3_one = new Vector3(1, 1, 1);\r\n this.Vector3_zero = new Vector3(0, 0, 0);\r\n this.canvas_renderer = undefined;\r\n\r\n this.display_texture_meshes = [];\r\n\r\n this.ctx = undefined;\r\n }\r\n\r\n draw_arrow(origin, dir, color = 0xff0000)\r\n {\r\n let arrow = new Arrow(color, dir.length(), dir.clone().normalize());\r\n arrow.position.copy(origin);\r\n SceneManager.current.add(arrow);\r\n return arrow;\r\n }\r\n\r\n draw_axis()\r\n {\r\n let axis = new AxisHelper();\r\n SceneManager.current.add(axis);\r\n return axis;\r\n }\r\n\r\n set_debug_RT(RT)\r\n {\r\n this.rt_debug = RT;\r\n }\r\n\r\n draw_rectangle(position_2d, width, height, color)\r\n {\r\n width = width || 100;\r\n height = height || 100;\r\n this.ctx.fillStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.fillRect(position_2d.x - width / 2,\r\n (this.ctx.canvas.height - position_2d.y) - height / 2, width, height);\r\n }\r\n\r\n clear()\r\n {\r\n if (this.ctx)\r\n {\r\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\r\n }\r\n }\r\n\r\n draw_line_2D(from, to, color)\r\n {\r\n this.ctx.strokeStyle = color || 'rgba(255, 0, 0, 1)';\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(from.x, from.y);\r\n this.ctx.lineTo(to.x, to.y);\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }\r\n\r\n draw_line(points, color = 0xff0000)\r\n {\r\n let material = new LineBasicMaterial({\r\n color: color\r\n });\r\n\r\n let geometry = new BufferGeometry().setFromPoints(points);\r\n\r\n let line = new Line(geometry, material);\r\n line.frustumCulled = false;\r\n SceneManager.current.add(line);\r\n return line;\r\n }\r\n\r\n draw_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n let cube = new Cube(new Vector3(size, size, size), undefined, color);\r\n cube.position.copy(pos);\r\n SceneManager.current.add(cube);\r\n return cube;\r\n }\r\n\r\n draw_oriented_cube(from, to, height = 1, color = '#FF0000', depth = 0.1)\r\n {\r\n let size = from.distanceTo(to);\r\n let cube = new Cube(new Vector3(depth, height, size), undefined, color);\r\n\r\n let center = to.clone().sub(from).multiplyScalar(0.5);\r\n let forward_dir = center.clone().normalize();\r\n center.add(from);\r\n\r\n cube.position.copy(center);\r\n\r\n // let up = new Vector3(0, 1, 0);\r\n // let forward = forward_dir.clone();\r\n // let right = forward.clone().cross(up);\r\n\r\n // cube.quaternion.setFromRotationMatrix(new Matrix4().makeBasis(right,up,forward));\r\n cube.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), forward_dir);\r\n\r\n SceneManager.current.add(cube);\r\n return cube;\r\n }\r\n\r\n draw_plane(width, height, color)\r\n {\r\n let geometry = new PlaneBufferGeometry(width, height);\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(0, 1, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n let plane = new Mesh(geometry, material);\r\n plane.renderOrder = -10000;\r\n SceneManager.current.add(plane);\r\n return plane;\r\n }\r\n\r\n draw_empty_cube(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n\r\n let box = new Box3().setFromCenterAndSize(new Vector3(), new Vector3(size, size, size));\r\n let helper = new Box3Helper(box, color);\r\n helper.position.copy(pos || new Vector3());\r\n return helper;\r\n }\r\n\r\n draw_sphere(pos, size, color)\r\n {\r\n size = size || 1;\r\n color = color || 0xff0000;\r\n pos = pos || new Vector3();\r\n\r\n let sphere = new Sphere(size, color);\r\n sphere.position.copy(pos);\r\n SceneManager.current.add(sphere);\r\n return sphere;\r\n }\r\n\r\n draw_point_array(input_points, open = false, color = 0xff0000)\r\n {\r\n let catmull = new CatmullRomCurve3(input_points, open);\r\n catmull.updateArcLengths();\r\n let points = catmull.getSpacedPoints(200);\r\n let line_helper = this.draw_line(points, 0x00ff00);\r\n // line_helper.position.y = 1.5;\r\n return line_helper;\r\n }\r\n\r\n draw_sphere_helper(sphere, color)\r\n {\r\n color = color || 0xff0000;\r\n let geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n let material = new MeshBasicMaterial({ color: color });\r\n let sphere_mesh = new Mesh(geometry, material);\r\n sphere_mesh.position.copy(sphere.center);\r\n SceneManager.current.add(sphere_mesh);\r\n return sphere_mesh;\r\n }\r\n\r\n draw_math_sphere(sphere)\r\n {\r\n let geometry = new SphereGeometry(sphere.radius, 32, 32);\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Vector4(1, 0, 0, 0.2) }\r\n },\r\n vertexShader: basic_color_vert,\r\n fragmentShader: basic_color_frag,\r\n transparent: true\r\n });\r\n // var material = new MeshBasicMaterial( {color: 0xff0000, transparent = true} );\r\n let sphere1 = new Mesh(geometry, material);\r\n sphere1.position.copy(sphere.center);\r\n SceneManager.current.add(sphere1);\r\n }\r\n\r\n draw_bounding_box(bb)\r\n {\r\n let helper = new Box3Helper(bb, 0xffff00);\r\n SceneManager.current.add(helper);\r\n }\r\n\r\n draw_curve(curve, options)\r\n {\r\n let offset = new Vector3(0, 0, 0);\r\n if (options)\r\n {\r\n offset.y = options.offset || 0;\r\n }\r\n\r\n for (let i = 0; i < curve.length - 1; i++)\r\n {\r\n this.draw_line(curve[i].clone().add(offset), curve[i + 1].clone().add(offset));\r\n }\r\n }\r\n\r\n draw_texture(tex, w, h)\r\n {\r\n let mesh = new Mesh(new PlaneBufferGeometry(1, 1), new ScreenSpaceTextureMaterial());\r\n this.display_texture_meshes.push(mesh);\r\n SceneManager.current.add(mesh);\r\n\r\n mesh.material.set_texture(tex, w, h);\r\n return mesh;\r\n }\r\n\r\n render()\r\n {\r\n for (let i = 0; i < this.display_texture_meshes.length; i++)\r\n {\r\n this.display_texture_meshes[i].material.set_screen_size(Screen.width, Screen.height);\r\n }\r\n }\r\n}\r\n\r\nexport default new Debug();\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/clear/clear_depth_normal.frag';\r\n\r\nimport { Vector4 } from 'three';\r\n\r\nexport default class ClearDepthNormalMaterial extends BlitMaterial\r\n{\r\n constructor(clear_depth, clear_normal)\r\n {\r\n super(frag);\r\n this.uniforms._DepthNormal = { value: new Vector4(clear_depth, clear_normal.x, clear_normal.y, clear_normal.z) };\r\n }\r\n}\r\n","import vert from '../shaders/depth_normals/depth_normals.vert';\r\nimport frag from '../shaders/depth_normals/depth_normals.frag';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nexport default class DepthNormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n _FarPlane: { value: 1 }\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n\r\n set far_plane(value)\r\n {\r\n this.uniforms._FarPlane.value = value;\r\n }\r\n\r\n get far_plane()\r\n {\r\n return this.uniforms._FarPlane.value;\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport Screen from '../Screen';\r\n\r\nimport ClearDepthNormalMaterial from '../materials/ClearDepthNormalMaterial';\r\nimport DepthNormalMaterial from '../materials/DepthNormalMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class DepthAndNormalsRenderer\r\n{\r\n constructor()\r\n {\r\n this.RT = new WebGLRenderTarget(Screen.width, Screen.height);\r\n\r\n this.clear_depth_normal_mat = new ClearDepthNormalMaterial(1, new Vector3(0, 0, 1));\r\n this.depth_normal_material = new DepthNormalMaterial();\r\n }\r\n\r\n render(graphics)\r\n {\r\n this.__resize_RT_if_necessary();\r\n\r\n graphics.clear(this.RT, undefined, true, true);\r\n\r\n graphics.blit_clear_with_material(this.RT, this.clear_depth_normal_mat);\r\n\r\n this.depth_normal_material.far_plane = CameraManager.current.far;\r\n\r\n graphics.render(undefined, undefined, this.RT, this.depth_normal_material);\r\n }\r\n\r\n __resize_RT_if_necessary()\r\n {\r\n if (this.RT.width !== Screen.width || this.RT.height !== Screen.height)\r\n {\r\n this.RT.setSize(Screen.width, Screen.height);\r\n }\r\n }\r\n\r\n get render_target()\r\n {\r\n return this.RT;\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\n\r\nimport { Scene } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nexport default class Blitter\r\n{\r\n constructor(renderer)\r\n {\r\n this.renderer = renderer;\r\n this._blit_scene = new Scene();\r\n this._blit_material = new BlitMaterial();\r\n this._blit_quad = new Mesh(\r\n new PlaneBufferGeometry(1, 1), this._blit_material);\r\n this._blit_scene.add(this._blit_quad);\r\n this._blit_camera = new OrthographicCamera(-1, 1, 1, -1, -10000, 10000);\r\n }\r\n\r\n blit(src, dst)\r\n {\r\n this._blit_quad.material = this._blit_material;\r\n\r\n let src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n let src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n let src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this._blit_quad.material = mat;\r\n this._blit_quad.material.uniforms._MainTex.value = undefined;\r\n this._blit_quad.material.uniforms._Resolution.value.set(1, 1);\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_with_material(src, dst, mat)\r\n {\r\n let src_texture = src.isWebGLRenderTarget === true ? src.texture : src;\r\n let src_width = src.isWebGLRenderTarget === true ? src.width : src.image.width;\r\n let src_height = src.isWebGLRenderTarget === true ? src.height : src.image.height;\r\n\r\n this._blit_quad.material = mat;\r\n this._blit_quad.material.uniforms._MainTex.value = src_texture;\r\n this._blit_quad.material.uniforms._Resolution.value.set(src_width, src_height);\r\n\r\n if (dst)\r\n {\r\n this._blit_quad.material.uniforms._TargetResolution.value.set(dst.width, dst.height);\r\n }\r\n else\r\n {\r\n this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value);\r\n }\r\n\r\n this.__render(dst);\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this._blit_quad.material = mat;\r\n\r\n this.__render(dst_RT);\r\n }\r\n\r\n dispose()\r\n {\r\n this._blit_quad.geometry.dispose();\r\n this._blit_quad.material.dispose();\r\n }\r\n\r\n __render(RT)\r\n {\r\n RT = RT === undefined ? null : RT;\r\n\r\n let current_rt = this.renderer.getRenderTarget();\r\n\r\n this.renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this.renderer.render(this._blit_scene, this._blit_camera);\r\n\r\n this.renderer.setRenderTarget(current_rt);\r\n }\r\n}\r\n","import Configuration from './Configuration';\r\nimport BaseRender from './render_mode/BaseRender';\r\nimport Screen from './Screen';\r\nimport CameraManager from './CameraManager';\r\nimport SceneManager from './SceneManager';\r\nimport Capabilities from './Capabilities';\r\nimport DepthAndNormalsRenderer from './render_utilities/DepthAndNormalsRenderer';\r\nimport Blitter from './render_utilities/Blitter';\r\n\r\nimport { WebGLRenderer } from 'three';\r\n\r\nclass Graphics\r\n{\r\n init(canvas, context_attributes)\r\n {\r\n console.log('graphics init');\r\n this._renderer = undefined;\r\n this.blitter = undefined;\r\n this.canvas = undefined;\r\n this.no_render = undefined;\r\n this.current_render_mode = undefined;\r\n this.generateDepthNormalTexture = false;\r\n this.depth_and_normals_renderer = undefined;\r\n\r\n this.is_webgl2 = false;\r\n this.canvas_context = undefined;\r\n this.context_attributes = undefined;\r\n\r\n this.context_attributes = context_attributes || {\r\n alpha: true,\r\n depth: true,\r\n desynchronized: false,\r\n stencil: false,\r\n antialias: false,\r\n premultipliedAlpha: true,\r\n preserveDrawingBuffer: true,\r\n powerPreference: 'high-performance',\r\n logarithmicDepthBuffer: false\r\n };\r\n\r\n if (context_attributes.force_webgl2)\r\n {\r\n this.canvas_context = canvas.getContext('webgl2', this.context_attributes) ||\r\n canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n else\r\n {\r\n this.canvas_context = canvas.getContext('webgl', this.context_attributes) ||\r\n canvas.getContext('experimental-webgl', this.context_attributes);\r\n }\r\n\r\n this.is_webgl2 = this.canvas_context.constructor.name === 'WebGL2RenderingContext';\r\n\r\n console.log(`Using WebGL ${this.is_webgl2 ? 2 : 1}`);\r\n\r\n this._renderer = new WebGLRenderer({\r\n canvas: canvas,\r\n context: this.canvas_context\r\n });\r\n this._renderer.autoClear = false;\r\n\r\n this._renderer.setPixelRatio(1);\r\n\r\n Screen.dpr = Configuration.dpr;\r\n\r\n if (!this.is_webgl2)\r\n {\r\n this._renderer.extensions.get('ANGLE_instanced_arrays');\r\n }\r\n\r\n this.blitter = new Blitter(this._renderer);\r\n\r\n this.canvas = this._renderer.domElement;\r\n\r\n this.no_render = new BaseRender();\r\n\r\n this.current_render_mode = this.no_render;\r\n Capabilities.max_anisotropy = this._renderer.capabilities.getMaxAnisotropy();\r\n Capabilities.vertex_texture_sampler_available = this._renderer.capabilities.maxVertexTextures > 0;\r\n Capabilities.fp_textures_available = this._renderer.capabilities.floatVertexTextures;\r\n\r\n this.generateDepthNormalTexture = false;\r\n\r\n this.depth_and_normals_renderer = new DepthAndNormalsRenderer();\r\n }\r\n\r\n get dom_element()\r\n {\r\n return this._renderer.domElement;\r\n }\r\n\r\n get depth_normals_RT()\r\n {\r\n return this.depth_and_normals_renderer.render_target;\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n // console.log('VIEWAPI - map render mode switch to: ' + new_state.constructor.name);\r\n\r\n this.current_render_mode.on_exit(this, this._renderer);\r\n this.current_render_mode = new_state;\r\n this.current_render_mode.on_enter(this, this._renderer);\r\n }\r\n\r\n update()\r\n {\r\n this.check_for_resize();\r\n\r\n if (this.generateDepthNormalTexture)\r\n {\r\n this.depth_and_normals_renderer.render(this);\r\n }\r\n\r\n this.__update_current_camera();\r\n\r\n if (CameraManager.current)\r\n {\r\n this.current_render_mode.render();\r\n }\r\n }\r\n\r\n __update_current_camera()\r\n {\r\n if (CameraManager.current)\r\n {\r\n CameraManager.current.aspect = Screen.aspect_ratio;\r\n CameraManager.current.updateProjectionMatrix();\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n render(scene, camera, RT, override_mat)\r\n {\r\n this.__apply_override_material(scene, override_mat);\r\n\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n this._renderer.render(scene || SceneManager.current,\r\n camera || CameraManager.current);\r\n\r\n this.__apply_override_material(scene, undefined);\r\n }\r\n\r\n __apply_override_material(scene, mat)\r\n {\r\n mat = mat === undefined ? null : mat;\r\n if (scene)\r\n {\r\n scene.overrideMaterial = mat;\r\n }\r\n else\r\n {\r\n SceneManager.current.overrideMaterial = mat;\r\n }\r\n }\r\n\r\n readback_RT(RT, buffer)\r\n {\r\n this._renderer.readRenderTargetPixels(RT, 0, 0, RT.width, RT.height, buffer);\r\n }\r\n\r\n clear(RT, camera, clear_depth, clear_stencil)\r\n {\r\n this._renderer.setRenderTarget(RT === undefined ? null : RT);\r\n\r\n if (camera)\r\n {\r\n this._renderer.setClearColor(camera.clear_color, camera.clear_alpha);\r\n }\r\n\r\n this._renderer.clear(!!camera, // clear color\r\n !!clear_depth,\r\n !!clear_stencil);\r\n }\r\n\r\n check_for_resize()\r\n {\r\n console.log('check_for_resize');\r\n let current_width = this.canvas.clientWidth;\r\n let current_height = this.canvas.clientHeight;\r\n\r\n if (\r\n current_width !== Screen.width ||\r\n current_height !== Screen.height ||\r\n Configuration.dpr !== Screen.dpr\r\n )\r\n {\r\n let canvas_rect = this.canvas.getBoundingClientRect();\r\n\r\n Screen.dpr = Configuration.dpr;\r\n Screen.update_position(canvas_rect.x, canvas_rect.y);\r\n Screen.update_size(current_width, current_height);\r\n\r\n this.canvas.width = Screen.render_width;\r\n this.canvas.height = Screen.render_height;\r\n\r\n this._renderer.setViewport(0, 0, Screen.render_width, Screen.render_height);\r\n\r\n this.__update_current_camera();\r\n }\r\n }\r\n\r\n on_resize()\r\n {\r\n console.error('Graphics.on_resize call no longer needed.');\r\n }\r\n\r\n material_pass(mat, dst)\r\n {\r\n this.blitter.material_pass(mat, dst);\r\n }\r\n\r\n blit(src_RT, dst_RT, mat)\r\n {\r\n if (mat)\r\n {\r\n this.blitter.blit_with_material(src_RT, dst_RT, mat);\r\n }\r\n else\r\n {\r\n this.blitter.blit(src_RT, dst_RT);\r\n }\r\n }\r\n\r\n blit_clear_with_material(dst_RT, mat)\r\n {\r\n this.blitter.blit_clear_with_material(dst_RT, mat);\r\n }\r\n\r\n take_screenshot(blob_callback, width = Screen.width, height = Screen.height)\r\n {\r\n // const ctx = this;\r\n\r\n let old_width = Screen.width;\r\n let old_height = Screen.height;\r\n\r\n let new_width = width;\r\n let new_height = height;\r\n\r\n let tile_width = 1024;\r\n let tile_height = 1024;\r\n\r\n let divisions_x = parseInt(Math.ceil(new_width / tile_width));\r\n let divisions_y = parseInt(Math.ceil(new_height / tile_height));\r\n\r\n Screen.update_size(tile_width, tile_height);\r\n\r\n this._renderer.setPixelRatio(1);\r\n\r\n this._renderer.setSize(tile_width, tile_height, false);\r\n\r\n let canvas_2d = document.createElement('canvas');\r\n let ctx_2D = canvas_2d.getContext('2d');\r\n\r\n ctx_2D.canvas.width = new_width;\r\n ctx_2D.canvas.height = new_height;\r\n\r\n CameraManager.current.aspect = Screen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n\r\n for (let x = 0; x < divisions_x; x++)\r\n {\r\n for (let y = 0; y < divisions_y; y++)\r\n {\r\n CameraManager.current.setViewOffset(new_width, new_height,\r\n Screen.width * x, Screen.height * y,\r\n Screen.width, Screen.height);\r\n this.current_render_mode.render();\r\n\r\n ctx_2D.drawImage(this._renderer.domElement, Screen.width * x, Screen.height * y);\r\n }\r\n }\r\n\r\n // transform the result canvas into a blob\r\n // from them the callback turns into a ULR and download it\r\n ctx_2D.canvas.toBlob(blob_callback, 'image/png;base64;');\r\n\r\n CameraManager.current.clearViewOffset();\r\n\r\n Screen.update_size(old_width, old_height);\r\n this._renderer.setPixelRatio(Configuration.dpr);\r\n this._renderer.setSize(old_width, old_height, false);\r\n\r\n CameraManager.current.aspect = Screen.aspect_ratio;\r\n CameraManager.current.updateMatrix();\r\n CameraManager.current.updateMatrixWorld(true);\r\n }\r\n\r\n download_screenshot(blob)\r\n {\r\n let link = document.createElement('a');\r\n link.download = 'Snapshot.png';\r\n\r\n link.href = URL.createObjectURL(blob);\r\n link.click();\r\n\r\n link.onclick = function()\r\n {\r\n requestAnimationFrame(function()\r\n {\r\n URL.revokeObjectURL(link.href);\r\n });\r\n link.removeAttribute('href');\r\n };\r\n }\r\n\r\n dispose()\r\n {\r\n this._renderer.dispose();\r\n this.current_render_mode.dispose();\r\n this.blitter.dispose();\r\n }\r\n}\r\n\r\nexport default new Graphics();\r\n","import frag from '../shaders/normal/normal.frag';\r\nimport vert from '../shaders/normal/normal.vert';\r\n\r\nimport { ShaderMaterial } from 'three';\r\n\r\nexport default class NormalMaterial extends ShaderMaterial\r\n{\r\n constructor()\r\n {\r\n super({\r\n uniforms: {\r\n },\r\n vertexShader: vert,\r\n fragmentShader: frag\r\n });\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Graphics from '../Graphics';\r\nimport NormalMaterial from '../materials/NormalMaterial';\r\n\r\nexport default class DebugNormalsRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n Graphics.render(SceneManager.current, CameraManager.current, undefined, new NormalMaterial());\r\n }\r\n}\r\n","import { InputController } from 'pit-js';\r\n\r\nclass Input extends InputController\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.left_mouse_button_clicked = false;\r\n this.captured_NDC = { x: 0, y: 0 };\r\n }\r\n\r\n clear()\r\n {\r\n super.clear();\r\n\r\n this.left_mouse_button_clicked = false;\r\n }\r\n}\r\n\r\nexport default new Input();\r\n","import { Vector3 } from 'three';\r\n\r\nclass ReflectionPlaneContext\r\n{\r\n init()\r\n {\r\n this.target_geometry = undefined;\r\n this.target_position = new Vector3();\r\n }\r\n\r\n set_target_geometry(geometry)\r\n {\r\n this.target_geometry = geometry;\r\n }\r\n}\r\n\r\nexport default new ReflectionPlaneContext();\r\n","import { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Mesh } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBAFormat } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { FloatType } from 'three';\r\n\r\nexport default class GeometryBatch\r\n{\r\n constructor(geometry, batch_width)\r\n {\r\n this.geometry = geometry;\r\n\r\n this.material = undefined;\r\n this.uniforms = {};\r\n this.batch_width = batch_width;\r\n\r\n this.data_textures = [];\r\n\r\n this.object_names = undefined;\r\n\r\n this.zero_offset = new Vector2();\r\n this.write_offset = new Vector2();\r\n\r\n this.uniform_dirty_count = 0;\r\n\r\n this.tmp_uploaded_data_count = 0;\r\n }\r\n\r\n init(object_names, vert_shader, frag_shader)\r\n {\r\n this.material = new ShaderMaterial({\r\n uniforms: this.uniforms,\r\n vertexShader: vert_shader,\r\n fragmentShader: frag_shader\r\n });\r\n this.object_names = object_names;\r\n }\r\n\r\n add_global_uniform(name, data)\r\n {\r\n this.uniforms[name] = { value: data };\r\n this.material.needsUpdate = true;\r\n }\r\n\r\n set_global_uniform(name, data)\r\n {\r\n this.uniforms[name].value = data;\r\n }\r\n\r\n add_object_uniform_v3(uniform_name, default_value_v3)\r\n {\r\n let src_tex = this.__create_rgb_texture(this.batch_width);\r\n let dst_tex = this.__create_rgb_texture(this.batch_width);\r\n let one_pixel_tex = this.__create_rgb_texture(1);\r\n\r\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v3)\r\n {\r\n this.__flood_data_texture_rgb(new_data_tex, default_value_v3);\r\n }\r\n }\r\n\r\n add_object_uniform_v4(uniform_name, default_value_v4)\r\n {\r\n let src_tex = this.__create_rgba_texture(this.batch_width);\r\n let dst_tex = this.__create_rgba_texture(this.batch_width);\r\n let one_pixel_tex = this.__create_rgba_texture(1);\r\n\r\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n add_object_uniform_v4_float(uniform_name, default_value_v4)\r\n {\r\n let src_tex = this.__create_rgba_float_texture(this.batch_width);\r\n let dst_tex = this.__create_rgba_float_texture(this.batch_width);\r\n let one_pixel_tex = this.__create_rgba_float_texture(1);\r\n\r\n let new_data_tex = this.__add_data_texture(uniform_name, src_tex, dst_tex, one_pixel_tex);\r\n\r\n if (default_value_v4)\r\n {\r\n this.__flood_data_texture_rgba(new_data_tex, default_value_v4);\r\n }\r\n }\r\n\r\n set_object_uniform_v3(object_name, uniform_name, vector3, use_r, use_g, use_b)\r\n {\r\n let obj_index = this.__get_object_index(object_name);\r\n let data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgb(data_texture.src, obj_index, vector3, use_r, use_g, use_b);\r\n this.__set_pixel_rgb(data_texture.one_pixel, 0, vector3, use_r, use_g, use_b);\r\n\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n set_object_uniform_v4(object_name, uniform_name, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n let obj_index = this.__get_object_index(object_name);\r\n let data_texture = this.__get_data_texture(uniform_name);\r\n\r\n this.__set_pixel_rgba(data_texture.src, obj_index, vector4, use_r, use_g, use_b, use_a);\r\n this.__set_pixel_rgba(data_texture.one_pixel, 0, vector4, use_r, use_g, use_b, use_a);\r\n data_texture.last_accessed_index = obj_index;\r\n\r\n data_texture.dirty_count++;\r\n }\r\n\r\n upload_texture_data(renderer, upload_budget)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (upload_budget > 0 && this.data_textures[i].dirty_count > 0)\r\n {\r\n if (this.data_textures[i].dirty_count === 1)\r\n {\r\n this.__partial_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n if (this.data_textures[i].dirty_count > 1)\r\n {\r\n this.__full_texture_data_upload(renderer, this.data_textures[i]);\r\n }\r\n\r\n this.data_textures[i].dirty_count = 0;\r\n\r\n upload_budget--;\r\n }\r\n }\r\n }\r\n\r\n get_uniform_dirty_count()\r\n {\r\n this.uniform_dirty_count = 0;\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].dirty_count > 0)\r\n {\r\n this.uniform_dirty_count++;\r\n }\r\n }\r\n return this.uniform_dirty_count;\r\n }\r\n\r\n __full_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"full texture update of\"+ texture_data.name);\r\n texture_data.dst.needsUpdate = true;\r\n renderer.copyTextureToTexture(\r\n this.zero_offset,\r\n texture_data.src,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n __partial_texture_data_upload(renderer, texture_data)\r\n {\r\n // console.log(\"partial texture update\"+ texture_data.name);\r\n let index = texture_data.last_accessed_index;\r\n if (index === -1)\r\n {\r\n return;\r\n }\r\n\r\n this.write_offset.y = Math.floor(index / this.batch_width);\r\n this.write_offset.x = index - this.batch_width * this.write_offset.y;\r\n renderer.copyTextureToTexture(\r\n this.write_offset,\r\n texture_data.one_pixel,\r\n texture_data.dst\r\n );\r\n }\r\n\r\n get_mesh()\r\n {\r\n return new Mesh(this.geometry, this.material);\r\n }\r\n\r\n __set_pixel_rgb(data_texture, index, vector3, use_r, use_g, use_b)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 3 + 0] = vector3.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 3 + 1] = vector3.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 3 + 2] = vector3.z;\r\n }\r\n }\r\n\r\n __set_pixel_rgba(data_texture, index, vector4, use_r, use_g, use_b, use_a)\r\n {\r\n if (use_r)\r\n {\r\n data_texture.image.data[index * 4 + 0] = vector4.x;\r\n }\r\n if (use_g)\r\n {\r\n data_texture.image.data[index * 4 + 1] = vector4.y;\r\n }\r\n if (use_b)\r\n {\r\n data_texture.image.data[index * 4 + 2] = vector4.z;\r\n }\r\n if (use_a)\r\n {\r\n data_texture.image.data[index * 4 + 3] = vector4.w;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgb(data_texture, v3)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgb(data_texture.src, i, v3, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __flood_data_texture_rgba(data_texture, v4)\r\n {\r\n for (let i = 0; i < this.batch_width * this.batch_width; i++)\r\n {\r\n this.__set_pixel_rgba(data_texture.src, i, v4, true, true, true, true);\r\n data_texture.dirty_count++;\r\n }\r\n }\r\n\r\n __create_rgb_texture(width)\r\n {\r\n let data = new Uint8Array(3 * width * width);\r\n return new DataTexture(data, width, width, RGBFormat);\r\n }\r\n\r\n __create_rgba_texture(width)\r\n {\r\n let data = new Uint8Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat);\r\n }\r\n\r\n __create_rgba_float_texture(width)\r\n {\r\n let data = new Float32Array(4 * width * width);\r\n return new DataTexture(data, width, width, RGBAFormat, FloatType);\r\n }\r\n\r\n __get_data_texture(uniform_name)\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n if (this.data_textures[i].name === uniform_name)\r\n {\r\n return this.data_textures[i];\r\n }\r\n }\r\n console.error('Data texture ' + uniform_name + ' does not exist');\r\n return undefined;\r\n }\r\n\r\n __get_object_index(name)\r\n {\r\n for (let i = 0; i < this.object_names.length; i++)\r\n {\r\n if (this.object_names[i] === name)\r\n {\r\n return i;\r\n }\r\n }\r\n console.error('the name ' + name + ' is not contained in this batch');\r\n return undefined;\r\n }\r\n\r\n __add_data_texture(uniform_name, src_texture, dst_texture, one_pixel_text)\r\n {\r\n dst_texture.needsUpdate = true;\r\n\r\n this.data_textures.push({\r\n name: uniform_name,\r\n src: src_texture,\r\n dst: dst_texture,\r\n one_pixel: one_pixel_text,\r\n last_accessed_index: -1,\r\n dirty_count: 0\r\n });\r\n\r\n this.uniforms[uniform_name] = { value: dst_texture };\r\n return this.data_textures[this.data_textures.length - 1];\r\n }\r\n\r\n dispose()\r\n {\r\n for (let i = 0; i < this.data_textures.length; i++)\r\n {\r\n this.data_textures[i].src.dispose();\r\n this.data_textures[i].dst.dispose();\r\n this.data_textures[i].one_pixel.dispose();\r\n }\r\n }\r\n}\r\n","import GeometryBatch from './GeometryBatch';\r\nimport { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\n\r\nimport { Math as TMath } from 'three';\r\nimport { BufferAttribute } from 'three';\r\n\r\nclass GeometryBatcher\r\n{\r\n init()\r\n {\r\n this.batches = [];\r\n }\r\n\r\n batch(buffer_geometries)\r\n {\r\n let attr_accessor_uvs = [];\r\n let texture_width = TMath.ceilPowerOfTwo(Math.sqrt(buffer_geometries.length));\r\n // console.log(\"Store count: \" + buffer_geometries.length + \", Texture size: \" +texture_width);\r\n\r\n this.__init_uv_array(attr_accessor_uvs, texture_width);\r\n\r\n let uv_index = 0;\r\n\r\n for (let i = 0; i < buffer_geometries.length; i++)\r\n {\r\n let vertex_count = buffer_geometries[i].getAttribute('position').count;\r\n let y = Math.floor(i / texture_width);\r\n let x = i - texture_width * y;\r\n for (let count = 0; count < vertex_count; count++)\r\n {\r\n attr_accessor_uvs[uv_index] = (x / texture_width) + 0.5 / texture_width;\r\n attr_accessor_uvs[uv_index + 1] = (y / texture_width) + 0.5 / texture_width;\r\n uv_index += 2;\r\n }\r\n }\r\n\r\n let buffer_attribute = new BufferAttribute(new Float32Array(attr_accessor_uvs), 2);\r\n let buffer_geometry = BufferGeometryUtils.mergeBufferGeometries(buffer_geometries);\r\n buffer_geometry.setAttribute('attr_accessor_uv', buffer_attribute);\r\n\r\n this.batches.push(new GeometryBatch(buffer_geometry, texture_width));\r\n return this.batches[this.batches.length - 1];\r\n }\r\n\r\n upload_texture_data(renderer)\r\n {\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n this.batches[i].upload_texture_data(renderer, 1);\r\n }\r\n }\r\n\r\n __init_uv_array(uvs, texture_width)\r\n {\r\n for (let i = 0; i < texture_width * texture_width * 2; i++)\r\n {\r\n uvs.push(0);\r\n }\r\n }\r\n}\r\n\r\nexport default new GeometryBatcher();\r\n","import Input from './Input';\r\nimport CameraManager from './CameraManager';\r\nimport Graphics from './Graphics';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Scene } from 'three';\r\nimport { OrthographicCamera } from 'three';\r\n\r\nclass UI\r\n{\r\n init()\r\n {\r\n this.ui_elements = [];\r\n this._tmp_normalized_pos = new Vector2();\r\n this.ss_scene = new Scene();\r\n this.ss_scene.autoUpdate = false;\r\n this.ss_scene.frustumCulled = false;\r\n\r\n this.ws_scene = new Scene();\r\n this.ws_scene.autoUpdate = false;\r\n this.ws_scene.frustumCulled = false;\r\n\r\n this.ss_camera = new OrthographicCamera(-1, 1, 1, -1, -100, 100);\r\n }\r\n\r\n delete_element(elem)\r\n {\r\n let index = this.ui_elements.indexOf(elem);\r\n if (index > -1)\r\n {\r\n this.ui_elements.splice(index, 1);\r\n }\r\n\r\n this.ss_scene.remove(elem);\r\n this.ws_scene.remove(elem);\r\n\r\n elem.dispose();\r\n }\r\n\r\n add_screen_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ss_scene.add(elem);\r\n\r\n elem.set_screen_space_coordinate_system();\r\n }\r\n\r\n add_world_space_element(elem)\r\n {\r\n this.ui_elements.push(elem);\r\n this.ws_scene.add(elem);\r\n\r\n elem.set_world_space_coordinate_system();\r\n }\r\n\r\n update()\r\n {\r\n // this.ss_camera.left = -Screen.width / 2;\r\n // this.ss_camera.right = Screen.width / 2;\r\n // this.ss_camera.top = Screen.top / 2;\r\n // this.ss_camera.right = -Screen.bottom / 2;\r\n this.ss_camera.updateProjectionMatrix();\r\n\r\n this._tmp_normalized_pos.copy(Input.NDC);\r\n for (let i = 0; i < this.ui_elements.length; i++)\r\n {\r\n this.ui_elements[i].update_state(this._tmp_normalized_pos);\r\n }\r\n }\r\n\r\n render(renderer)\r\n {\r\n // renderer.render_ui(this.scene);\r\n if (this.ss_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ss_scene, this.ss_camera);\r\n }\r\n if (this.ws_scene.children.length > 0)\r\n {\r\n Graphics.render(this.ws_scene, CameraManager.current);\r\n }\r\n }\r\n\r\n clear()\r\n {\r\n this.current_clicked_element = undefined;\r\n }\r\n}\r\n\r\nexport default new UI();\r\n","import { Vector3 } from 'three';\r\nimport { Math as TMath } from 'three';\r\n\r\nexport default class MathUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static linear_map(value,\r\n from_range_start_value,\r\n from_range_end_value,\r\n to_range_start_value,\r\n to_range_end_value)\r\n {\r\n return ((value - from_range_start_value) / (from_range_end_value - from_range_start_value)) * (to_range_end_value - to_range_start_value) + to_range_start_value;\r\n }\r\n\r\n static between(value, min, max)\r\n {\r\n return (value >= min && value <= max);\r\n }\r\n\r\n static mod(number, divisor)\r\n {\r\n return ((number % divisor) + divisor) % divisor;\r\n }\r\n\r\n static rgb_to_hex(rgb)\r\n {\r\n rgb.r = Math.round(rgb.r * 255).toString(16);\r\n rgb.g = Math.round(rgb.g * 255).toString(16);\r\n rgb.b = Math.round(rgb.b * 255).toString(16);\r\n\r\n if (rgb.r.length === 1)\r\n {\r\n rgb.r = '0' + rgb.r;\r\n }\r\n if (rgb.g.length === 1)\r\n {\r\n rgb.g = '0' + rgb.g;\r\n }\r\n if (rgb.b.length === 1)\r\n {\r\n rgb.b = '0' + rgb.b;\r\n }\r\n\r\n return '#' + rgb.r + rgb.g + rgb.b;\r\n }\r\n\r\n static project_points_on_plane(points, plane)\r\n {\r\n let projected_point = new Vector3();\r\n let points_on_plane = [];\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n plane.projectPoint(points[i], projected_point);\r\n points_on_plane.push(projected_point.clone());\r\n }\r\n\r\n return points_on_plane;\r\n }\r\n\r\n static matrix4_lerp(from, to, target, t)\r\n {\r\n for (let i = 0; i < 16; i++)\r\n {\r\n target.elements[i] = TMath.lerp(from.elements[i], to.elements[i], t);\r\n }\r\n }\r\n\r\n static equals(x1, x2)\r\n {\r\n return Math.abs(x1 - x2) < 0.000001;\r\n }\r\n\r\n static perspective_divide(v)\r\n {\r\n v.x /= v.w;\r\n v.y /= v.w;\r\n v.z /= v.w;\r\n return v;\r\n }\r\n\r\n static points_average(points)\r\n {\r\n let center = points[0].clone();\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n center.add(points[i]);\r\n }\r\n center.multiplyScalar(1 / points.length);\r\n return center;\r\n }\r\n\r\n static get_random_color()\r\n {\r\n let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];\r\n\r\n let col = '#';\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n\r\n col += arr[Math.floor(Math.random() * 16)];\r\n col += arr[Math.floor(Math.random() * 16)];\r\n return col;\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport Input from '../Input';\r\nimport MathUtilities from '../utilities/MathUtilities';\r\nimport Screen from '../Screen';\r\n\r\nimport { Vector3 } from 'three';\r\nimport { Matrix4 } from 'three';\r\nimport { Plane } from 'three';\r\nimport { Ray } from 'three';\r\nimport { Sphere } from 'three';\r\nimport { Box3 } from 'three';\r\n\r\nclass CameraUtilities\r\n{\r\n init()\r\n {\r\n this.tmp_mat = new Matrix4();\r\n this.tmp_vec = new Vector3(0, 0, 1);\r\n this.tmp_vec2 = new Vector3(0, 0, 0);\r\n this.plane = new Plane();\r\n this.ray = new Ray();\r\n\r\n this.tmp_size = new Vector3();\r\n this.tmp_unproj = new Vector3();\r\n }\r\n\r\n get_up_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n this.tmp_vec.set(0, 1, 0);\r\n this.tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return this.tmp_vec;\r\n }\r\n\r\n get_forward_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n this.tmp_vec.set(0, 0, -1);\r\n this.tmp_vec.applyQuaternion(camera.quaternion);\r\n\r\n return this.tmp_vec;\r\n }\r\n\r\n get_right_dir(camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n this.tmp_vec.set(1, 0, 0);\r\n this.tmp_vec.applyQuaternion(camera.quaternion);\r\n return this.tmp_vec;\r\n }\r\n\r\n unproject_mouse_position(NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n let v_fov = (camera.fov / 2) * Math.PI / 180;\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * camera.aspect)) / 2;\r\n\r\n let distV = Math.tan(v_fov) * camera.far;\r\n let distH = Math.tan(h_fov) * camera.far;\r\n\r\n this.tmp_vec.set(distH * NDC.x, distV * NDC.y, -camera.far).normalize();\r\n\r\n return this.tmp_vec.applyQuaternion(camera.quaternion);\r\n }\r\n\r\n get_plane_intersection(plane_position, plane_normal, NDC, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n NDC = NDC || Input.NDC;\r\n\r\n this.plane.setFromNormalAndCoplanarPoint(plane_normal || this.get_forward_dir(camera), plane_position);\r\n if (camera.isPerspectiveCamera)\r\n {\r\n this.ray.set(camera.position, this.unproject_mouse_position(NDC, camera));\r\n }\r\n else\r\n {\r\n this.tmp_unproj.set(NDC.x, NDC.y, 1).unproject(camera);\r\n this.ray.set(camera.position, this.tmp_unproj);\r\n }\r\n\r\n this.ray.intersectPlane(this.plane, this.tmp_vec2);\r\n return this.tmp_vec2;\r\n }\r\n\r\n fit_points_on_camera(points, zoom_scale = 1)\r\n {\r\n let points_sphere = new Sphere().setFromPoints(points);\r\n let world_space_center = points_sphere.center;\r\n let camera_forward = this.get_forward_dir(CameraManager.current).clone();\r\n\r\n let plane = new Plane().setFromNormalAndCoplanarPoint(camera_forward, world_space_center);\r\n\r\n let points_on_plane = MathUtilities.project_points_on_plane(points, plane);\r\n\r\n let projected_points_center = new Vector3();\r\n let box = new Box3().setFromPoints(points_on_plane);\r\n box.getCenter(projected_points_center);\r\n\r\n let up = new Vector3(0, 1, 0).applyQuaternion(CameraManager.current.quaternion);\r\n let right = up.clone().cross(camera_forward).normalize();\r\n let mat = new Matrix4().set(right.x, up.x, camera_forward.x, world_space_center.x,\r\n right.y, up.y, camera_forward.y, world_space_center.y,\r\n right.z, up.z, camera_forward.z, world_space_center.z,\r\n 0, 0, 0, 1);\r\n\r\n let inverse_mat = new Matrix4().getInverse(mat);\r\n for (let i = 0; i < points_on_plane.length; i++)\r\n {\r\n points_on_plane[i].applyMatrix4(inverse_mat);\r\n }\r\n\r\n let size = new Vector3();\r\n box = new Box3().setFromPoints(points_on_plane);\r\n box.getSize(size);\r\n size.multiplyScalar(zoom_scale);\r\n let projected_center = new Vector3();\r\n box.getCenter(projected_center);\r\n\r\n return {\r\n position: projected_points_center,\r\n zoom: this.get_zoom_to_fit_rect(size.x / 2, size.y / 2)\r\n };\r\n }\r\n\r\n get_zoom_to_fit_rect(width, height)\r\n {\r\n let v_fov = (CameraManager.current.fov / 2) * Math.PI / 180;\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * CameraManager.current.aspect)) / 2;\r\n\r\n let distV = height / Math.tan(v_fov);\r\n let distH = width / Math.tan(h_fov);\r\n\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n\r\n get_zoom_to_fit_box(bb, camera)\r\n {\r\n if (camera.isOrthographicCamera)\r\n {\r\n bb.getSize(this.tmp_size);\r\n\r\n let obj_x = this.tmp_size.x;\r\n let obj_y = this.tmp_size.y;\r\n let object_aspect = obj_x / obj_y;\r\n if (Screen.aspect_ratio / object_aspect > 1)\r\n {\r\n return Screen.height / obj_y;\r\n }\r\n else\r\n {\r\n return Screen.width / obj_x;\r\n }\r\n }\r\n else\r\n {\r\n // return this.fit_points_on_camera([bb.min, bb.max], 1).zoom;\r\n let size = new Vector3();\r\n bb.getSize(size);\r\n return this.get_zoom_to_fit_rect(size.x, size.y);\r\n }\r\n }\r\n\r\n get_html_screen_pos(object, camera)\r\n {\r\n object.getWorldPosition(this.tmp_vec);\r\n this.tmp_vec.project(camera);\r\n\r\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\r\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\r\n return this.tmp_vec;\r\n }\r\n\r\n world_pos_to_screen(pos, camera)\r\n {\r\n camera = camera || CameraManager.current;\r\n this.tmp_vec.copy(pos);\r\n this.tmp_vec.project(camera);\r\n\r\n this.tmp_vec.x = (this.tmp_vec.x * 0.5 + 0.5) * (Screen.width);\r\n this.tmp_vec.y = (1 - (this.tmp_vec.y * 0.5 + 0.5)) * Screen.height;\r\n return this.tmp_vec;\r\n }\r\n\r\n update_projection(camera)\r\n {\r\n camera.left = -Screen.width / 2;\r\n camera.right = Screen.width / 2;\r\n camera.top = Screen.height / 2;\r\n camera.bottom = -Screen.height / 2;\r\n camera.aspect = Screen.aspect_ratio;\r\n camera.updateProjectionMatrix(true);\r\n }\r\n}\r\n\r\nexport default new CameraUtilities();\r\n","import CameraManager from './CameraManager';\r\nimport Capabilities from './Capabilities';\r\nimport Configuration from './Configuration';\r\nimport Debug from './Debug';\r\nimport EventManager from './EventManager';\r\nimport Graphics from './Graphics';\r\nimport Input from './Input';\r\nimport OS from './OS';\r\nimport ReflectionPlaneContext from './ReflectionPlaneContext';\r\nimport ResourceContainer from './ResourceContainer';\r\nimport SceneManager from './SceneManager';\r\nimport Screen from './Screen';\r\nimport GeometryBatcher from './static_batcher/GeometryBatcher';\r\nimport Time from './Time';\r\nimport UI from './UI';\r\nimport CameraUtilities from './utilities/CameraUtilities';\r\n\r\nclass Initializer\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n init(canvas, app_container, context_attributes)\r\n {\r\n CameraManager.init();\r\n CameraUtilities.init();\r\n Capabilities.init();\r\n Configuration.init();\r\n EventManager.init();\r\n GeometryBatcher.init();\r\n Input.init(app_container);\r\n OS.init();\r\n ReflectionPlaneContext.init();\r\n ResourceContainer.init();\r\n SceneManager.init();\r\n Screen.init();\r\n Time.init();\r\n UI.init();\r\n\r\n Graphics.init(canvas, context_attributes);\r\n Debug.init();\r\n }\r\n\r\n dispose(render_loop)\r\n {\r\n Graphics.dispose();\r\n Input.dispose();\r\n SceneManager.dispose();\r\n\r\n render_loop.dispose();\r\n }\r\n}\r\n\r\nexport default new Initializer();\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class JSONLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (data) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, JSON.parse(data));\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao.frag';\r\nimport vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\nimport { Math as TMath } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { DataTexture } from 'three';\r\nimport { RGBFormat } from 'three';\r\nimport { RepeatWrapping } from 'three';\r\n\r\nexport default class SSAOMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, vert);\r\n\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n this.uniforms._ProjectionMatrix = { value: new Matrix4() };\r\n\r\n this.uniforms._Bias = { value: 0.0125 };\r\n this.uniforms._Radius = { value: 0.3 };\r\n this.uniforms._FarPlane = { value: 100 };\r\n\r\n this.uniforms._SampleKernel = { value: this.__get_sample_kernel() };\r\n this.uniforms._RandomRotation = { value: this.__get_rotation_kernel() };\r\n }\r\n\r\n __get_sample_kernel()\r\n {\r\n let sample_kernel = [];\r\n let kernel_size = 64;\r\n\r\n for (let i = 0; i < kernel_size; i++)\r\n {\r\n let dir = new Vector3(Math.random() * 2 - 1,\r\n Math.random() * 2 - 1,\r\n Math.random());\r\n dir.normalize();\r\n let scale = i / kernel_size;\r\n scale = TMath.lerp(0.1, 1.0, scale * scale);\r\n dir.multiplyScalar(scale);\r\n\r\n sample_kernel.push(dir);\r\n }\r\n return sample_kernel;\r\n }\r\n\r\n __get_rotation_kernel()\r\n {\r\n let rotation_kernel = new Uint8Array(3 * 16);\r\n for (let i = 0; i < 16; i++)\r\n {\r\n rotation_kernel[i * 3 + 1] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 2] = Math.floor(Math.random() * 255);\r\n rotation_kernel[i * 3 + 3] = 0;\r\n }\r\n\r\n let rotation_texture = new DataTexture(rotation_kernel, 4, 4, RGBFormat);\r\n rotation_texture.wrapS = RepeatWrapping;\r\n rotation_texture.wrapT = RepeatWrapping;\r\n\r\n rotation_texture.needsUpdate = true;\r\n return rotation_texture;\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/ssao/ssao_compose.frag';\r\n\r\nexport default class SSAOComposeMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._AO = { value: undefined };\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/depth_normals/debug_normals.frag';\r\nimport depth_normals_vert from '../shaders/ssao/ssao.vert';\r\n\r\nimport { Matrix4 } from 'three';\r\n\r\nexport default class DisplayNormalTextureMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, depth_normals_vert);\r\n this.uniforms._FarPlane = { value: 1 };\r\n this.uniforms._InverseProjMatrix = { value: new Matrix4() };\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/box_blur/box_blur.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class BoxBlurMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag);\r\n this.uniforms._SampleDir = { value: new Vector2() };\r\n }\r\n}\r\n","import BoxBlurMaterial from '../materials/BoxBlurMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class Blurrer\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT1 = new WebGLRenderTarget(1, 1);\r\n this.RT2 = new WebGLRenderTarget(1, 1);\r\n this.box_blur_mat = new BoxBlurMaterial();\r\n }\r\n\r\n blur(RT)\r\n {\r\n if (RT.width !== this.RT1.width || RT.height !== this.RT1.height)\r\n {\r\n this.RT1.setSize(RT.width, RT.height);\r\n this.RT2.setSize(RT.width, RT.height);\r\n }\r\n\r\n this.box_blur_mat.uniforms._SampleDir.value.set(1, 0);\r\n Graphics.blit(RT, this.RT1, this.box_blur_mat);\r\n this.box_blur_mat.uniforms._SampleDir.value.set(0, 1);\r\n Graphics.blit(this.RT1, RT, this.box_blur_mat);\r\n // return this.RT2;\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport Screen from '../Screen';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Configuration from '../Configuration';\r\nimport SSAOMaterial from '../materials/SSAOMaterial';\r\nimport SSAOComposeMaterial from '../materials/SSAOComposeMaterial';\r\nimport DisplayNormalTextureMaterial from '../materials/DisplayNormalTextureMaterial';\r\nimport Blurrer from '../render_utilities/Blurrer';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nexport default class NormalAORender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.ssao_mat = new SSAOMaterial();\r\n this.ssao_compose_mat = new SSAOComposeMaterial();\r\n this.debug_normals = new DisplayNormalTextureMaterial();\r\n\r\n this.ssaa = Configuration.use_ssaa ? 2 : 1;\r\n\r\n this.main_RT = new WebGLRenderTarget(Screen.width * this.ssaa, Screen.height * this.ssaa);\r\n\r\n this.SSAO_RT = new WebGLRenderTarget(Screen.width, Screen.height);\r\n\r\n this.blurrer = new Blurrer();\r\n Graphics.generateDepthNormalTexture = true;\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n this.__update_uniforms();\r\n\r\n Graphics.blit(Graphics.depth_normals_RT, this.SSAO_RT, this.ssao_mat);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.SSAO_RT);\r\n Graphics.blit(this.SSAO_RT, undefined);\r\n\r\n // // COMPOSE\r\n this.ssao_compose_mat.uniforms._AO.value = this.SSAO_RT.texture;\r\n Graphics.blit(this.main_RT, undefined, this.ssao_compose_mat);\r\n\r\n // Graphics.blit(this.SSAO_RT, undefined);\r\n }\r\n\r\n __update_uniforms()\r\n {\r\n this.ssao_mat.uniforms._InverseProjMatrix.value.getInverse(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._ProjectionMatrix.value.copy(CameraManager.current.projectionMatrix);\r\n this.ssao_mat.uniforms._FarPlane.value = CameraManager.current.far;\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== Screen.width * this.ssaa || this.main_RT.height !== Screen.height * this.ssaa)\r\n {\r\n this.main_RT.setSize(Screen.width * this.ssaa, Screen.height * this.ssaa);\r\n this.SSAO_RT.setSize(Screen.width, Screen.height);\r\n }\r\n }\r\n}\r\n","import CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport Graphics from '../Graphics';\r\n\r\nexport default class NormalRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n render()\r\n {\r\n Graphics.clear(undefined, CameraManager.current, true, true);\r\n\r\n Graphics.render(SceneManager.current, CameraManager.current);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/unreal_bloom_compose.frag';\r\nimport { Color } from 'three';\r\nexport default class UnrealBloomComposeMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\r\n {\r\n super(frag, undefined, {\r\n NUM_MIPS: nMips\r\n });\r\n this.uniforms._MainTex = { value: undefined };\r\n this.uniforms._BlurredTex = { value: undefined };\r\n this.uniforms._BloomStrength = { value: 1 };\r\n\r\n this.uniforms.blurTexture1 = { value: null };\r\n this.uniforms.blurTexture2 = { value: null };\r\n this.uniforms.blurTexture3 = { value: null };\r\n this.uniforms.blurTexture4 = { value: null };\r\n this.uniforms.blurTexture5 = { value: null };\r\n\r\n this.uniforms.bloomStrength = { value: 1.0 };\r\n this.uniforms.bloomFactors = { value: [1.0, 0.8, 0.6, 0.4, 0.2] };\r\n this.uniforms.bloomRadius = { value: 0.0 };\r\n\r\n let bloomTintColors = [\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF'),\r\n new Color('#FFFFFF')\r\n ];\r\n\r\n this.uniforms.bloomTintColors = { value: bloomTintColors };\r\n }\r\n\r\n set_RT_0(rt)\r\n {\r\n this.uniforms.blurTexture1.value = rt;\r\n }\r\n\r\n set_RT_1(rt)\r\n {\r\n this.uniforms.blurTexture2.value = rt;\r\n }\r\n\r\n set_RT_2(rt)\r\n {\r\n this.uniforms.blurTexture3.value = rt;\r\n }\r\n\r\n set_RT_3(rt)\r\n {\r\n this.uniforms.blurTexture4.value = rt;\r\n }\r\n\r\n set_RT_4(rt)\r\n {\r\n this.uniforms.blurTexture5.value = rt;\r\n }\r\n\r\n set_bloom_strength(value)\r\n {\r\n this.uniforms.bloomStrength.value = value;\r\n }\r\n\r\n set_bloom_radius(value)\r\n {\r\n this.uniforms.bloomRadius.value = value;\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[0].set(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[1].set(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[2].set(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[3].set(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.uniforms.bloomTintColors.value[4].set(col_string);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/add/add.frag';\r\n\r\nexport default class AddMaterial extends BlitMaterial\r\n{\r\n constructor(nMips)\r\n {\r\n super(frag);\r\n\r\n this.uniforms._SecondTex = { value: undefined };\r\n }\r\n\r\n set_add_texture(tex)\r\n {\r\n this.uniforms._SecondTex.value = tex;\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/gaussian_blur/gaussian_blur.frag';\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class GaussianBlurMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\r\n {\r\n super(frag, undefined, {\r\n KERNEL_RADIUS: kernel_radius,\r\n SIGMA: kernel_radius\r\n });\r\n\r\n this.uniforms.texSize = { value: new Vector2(0.5, 0.5) };\r\n this.uniforms.direction = { value: new Vector2(0.5, 0.5) };\r\n }\r\n\r\n set_size(w, h)\r\n {\r\n this.uniforms.texSize.value.x = w;\r\n this.uniforms.texSize.value.y = h;\r\n }\r\n\r\n set_direction(x, y)\r\n {\r\n this.uniforms.direction.value.set(x, y);\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport frag from '../shaders/luminosity_high_pass/luminosity_high_pass.frag';\r\nimport { Color } from 'three';\r\nexport default class LuminosityHighPassMaterial extends BlitMaterial\r\n{\r\n constructor(kernel_radius)\r\n {\r\n super(frag);\r\n\r\n this.uniforms.luminosityThreshold = { value: 0.23 };\r\n this.uniforms.smoothWidth = { value: 0.01 };\r\n this.uniforms.defaultColor = { value: new Color('#000000') };\r\n this.uniforms.defaultOpacity = { value: 0.0 };\r\n }\r\n}\r\n","import GaussianBlurMaterial from '../materials/GaussianBlurMaterial';\r\nimport LuminosityHighPassMaterial from '../materials/LuminosityHighPassMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, LinearFilter, RGBAFormat } from 'three';\r\n\r\nexport default class GaussianBlurrer\r\n{\r\n constructor(nMips = 5)\r\n {\r\n this.current_width = 1;\r\n this.current_height = 1;\r\n\r\n this.separableBlurMaterials = [];\r\n this.renderTargetsHorizontal = [];\r\n this.renderTargetsVertical = [];\r\n\r\n this.nMips = nMips;\r\n this.kernelSizeArray = [3, 5, 7, 9, 11];\r\n this.rt_pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat };\r\n\r\n this.renderTargetBright = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n this.renderTargetBright.texture.generateMipmaps = false;\r\n\r\n this.init_materials();\r\n this.init_RT();\r\n\r\n this.luminosity_high_pass_mat = new LuminosityHighPassMaterial();\r\n }\r\n\r\n blur(RT, use_luminosity_high_pass)\r\n {\r\n this.resize_RT(RT.width, RT.height);\r\n\r\n if (use_luminosity_high_pass)\r\n {\r\n Graphics.blit(RT, this.renderTargetBright, this.luminosity_high_pass_mat);\r\n }\r\n else\r\n {\r\n Graphics.blit(RT, this.renderTargetBright);\r\n }\r\n\r\n let inputRenderTarget = this.renderTargetBright;\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n let mat = this.separableBlurMaterials[i];\r\n\r\n mat.set_direction(1, 0);\r\n Graphics.blit(inputRenderTarget, this.renderTargetsHorizontal[i], mat);\r\n\r\n mat.set_direction(0, 1);\r\n Graphics.blit(this.renderTargetsHorizontal[i], this.renderTargetsVertical[i], mat);\r\n\r\n inputRenderTarget = this.renderTargetsVertical[i];\r\n }\r\n }\r\n\r\n get_blurred_texture()\r\n {\r\n return this.renderTargetsHorizontal[0].texture;\r\n }\r\n\r\n get_blurred_RT()\r\n {\r\n return this.renderTargetsHorizontal[0];\r\n }\r\n\r\n init_RT()\r\n {\r\n this.dispose_RT();\r\n\r\n this.renderTargetBright.setSize(1, 1);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n let hor = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n let ver = new WebGLRenderTarget(1, 1, this.rt_pars);\r\n\r\n hor.texture.generateMipmaps = false;\r\n ver.texture.generateMipmaps = false;\r\n\r\n this.renderTargetsHorizontal.push(hor);\r\n this.renderTargetsVertical.push(ver);\r\n }\r\n }\r\n\r\n resize_RT(texture_width, texture_height)\r\n {\r\n if (this.current_width === texture_width && this.current_height === texture_height)\r\n {\r\n return;\r\n }\r\n\r\n this.current_width = texture_width;\r\n this.current_height = texture_height;\r\n\r\n let width = Math.round(texture_width / 2);\r\n let height = Math.round(texture_height / 2);\r\n\r\n this.renderTargetBright.setSize(width, height);\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.renderTargetsVertical[i].setSize(width, height);\r\n this.renderTargetsHorizontal[i].setSize(width, height);\r\n this.separableBlurMaterials[i].set_size(width, height);\r\n\r\n width = Math.round(width / 2);\r\n height = Math.round(height / 2);\r\n }\r\n }\r\n\r\n init_materials(texture_width, texture_height)\r\n {\r\n this.dispose_materials();\r\n\r\n for (let i = 0; i < this.nMips; i++)\r\n {\r\n this.separableBlurMaterials.push(new GaussianBlurMaterial(this.kernelSizeArray[i]));\r\n }\r\n }\r\n\r\n dispose_materials()\r\n {\r\n for (let i = 0; i < this.separableBlurMaterials.length; i++)\r\n {\r\n this.separableBlurMaterials[i].dispose();\r\n }\r\n this.separableBlurMaterials.length = 0;\r\n }\r\n\r\n dispose_RT()\r\n {\r\n for (let i = 0; i < this.renderTargetsVertical.length; i++)\r\n {\r\n this.renderTargetsHorizontal[i].dispose();\r\n this.renderTargetsVertical[i].dispose();\r\n }\r\n this.renderTargetBright.dispose();\r\n\r\n this.renderTargetsHorizontal.length = 0;\r\n this.renderTargetsVertical.length = 0;\r\n }\r\n}\r\n","import Screen from '../Screen';\r\nimport BaseRender from '../render_mode/BaseRender';\r\nimport UnrealBloomComposeMaterial from '../materials/UnrealBloomComposeMaterial';\r\nimport AddMaterial from '../materials/AddMaterial';\r\n\r\nimport { WebGLRenderTarget } from 'three';\r\n\r\nimport GaussianBlurrer from '../render_utilities/GaussianBlurrer';\r\nimport Graphics from '../Graphics';\r\nimport CameraManager from '../CameraManager';\r\nimport SceneManager from '../SceneManager';\r\n\r\nexport default class UnrealBloomRender extends BaseRender\r\n{\r\n constructor()\r\n {\r\n super();\r\n\r\n this.bloom_compose_mat = undefined;\r\n\r\n this.main_RT = undefined;\r\n this.blur_RT = undefined;\r\n this.blurrer = undefined;\r\n\r\n this.add_mat = new AddMaterial();\r\n }\r\n\r\n on_enter()\r\n {\r\n this.blurrer = new GaussianBlurrer();\r\n this.main_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\r\n this.blur_RT = new WebGLRenderTarget(Screen.render_width, Screen.render_height);\r\n\r\n this.bloom_compose_mat = new UnrealBloomComposeMaterial(5);\r\n this.blurrer = new GaussianBlurrer(5);\r\n\r\n this.bloom_compose_mat.set_RT_0(this.blurrer.renderTargetsVertical[0].texture);\r\n this.bloom_compose_mat.set_RT_1(this.blurrer.renderTargetsVertical[1].texture);\r\n this.bloom_compose_mat.set_RT_2(this.blurrer.renderTargetsVertical[2].texture);\r\n this.bloom_compose_mat.set_RT_3(this.blurrer.renderTargetsVertical[3].texture);\r\n this.bloom_compose_mat.set_RT_4(this.blurrer.renderTargetsVertical[4].texture);\r\n\r\n this.bloom_compose_mat.set_bloom_strength(1);\r\n this.bloom_compose_mat.set_bloom_radius(1);\r\n\r\n this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture);\r\n }\r\n\r\n set_bloom_strength(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_strength(val);\r\n }\r\n\r\n set_bloom_radius(val)\r\n {\r\n this.bloom_compose_mat.set_bloom_radius(val);\r\n }\r\n\r\n set_tint_color_0(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_0(col_string);\r\n }\r\n\r\n set_tint_color_1(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_1(col_string);\r\n }\r\n\r\n set_tint_color_2(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_2(col_string);\r\n }\r\n\r\n set_tint_color_3(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_3(col_string);\r\n }\r\n\r\n set_tint_color_4(col_string)\r\n {\r\n this.bloom_compose_mat.set_tint_color_4(col_string);\r\n }\r\n\r\n render()\r\n {\r\n this.__check_RT_size();\r\n\r\n Graphics.clear(this.main_RT, CameraManager.current, true, false);\r\n Graphics.render(SceneManager.current, CameraManager.current, this.main_RT);\r\n\r\n // // BLUR\r\n this.blurrer.blur(this.main_RT, true);\r\n\r\n // Blur compose\r\n Graphics.material_pass(this.bloom_compose_mat, this.blurrer.renderTargetsHorizontal[0]);\r\n\r\n // Additive blend\r\n Graphics.blit(this.main_RT, undefined, this.add_mat);\r\n }\r\n\r\n __check_RT_size()\r\n {\r\n if (this.main_RT.width !== Screen.render_width || this.main_RT.height !== Screen.render_height)\r\n {\r\n this.main_RT.setSize(Screen.render_width, Screen.render_height);\r\n this.blur_RT.setSize(Screen.render_width, Screen.render_height);\r\n }\r\n }\r\n}\r\n","import { Color } from 'three';\r\nimport { OrthographicCamera as THREEOrthographicCamera } from 'three';\r\n\r\nexport default class OrthographicCamera extends THREEOrthographicCamera\r\n{\r\n constructor(left, right, top, bottom, near, far)\r\n {\r\n super(left, right, top, bottom, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n}\r\n","import { Color } from 'three';\r\nimport { PerspectiveCamera as THREEPerspectiveCamera } from 'three';\r\n\r\nexport default class PerspectiveCamera extends THREEPerspectiveCamera\r\n{\r\n constructor(fov, aspect, near, far)\r\n {\r\n super(fov, aspect, near, far);\r\n\r\n this.clear_color = new Color('#000000');\r\n this.clear_alpha = 1;\r\n }\r\n}\r\n","import Arrow from './primitives/Arrow';\r\nimport Cube from './primitives/Cube';\r\nimport HorizontalPlane from './primitives/HorizontalPlane';\r\nimport Sphere from './primitives/Sphere';\r\nimport VerticalPlane from './primitives/VerticalPlane';\r\n\r\nexport default {\r\n Arrow: Arrow,\r\n Cube: Cube,\r\n HorizontalPlane: HorizontalPlane,\r\n Sphere: Sphere,\r\n VerticalPlane: VerticalPlane\r\n};\r\n","import { Mesh } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\n\r\nexport default class HorizontalPlane extends Mesh\r\n{\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n let geometry = new PlaneBufferGeometry(width, height);\r\n geometry.rotateX(-3.14 / 2);\r\n super(geometry, material);\r\n }\r\n}\r\n","import { Mesh } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\nimport { MeshBasicMaterial } from 'three';\r\n\r\nexport default class VerticalPlane extends Mesh\r\n{\r\n constructor(width, height, color, material)\r\n {\r\n width = width || 1;\r\n height = height || 1;\r\n color = color || '#FF0000';\r\n material = material || new MeshBasicMaterial({ color: color });\r\n\r\n let geometry = new PlaneBufferGeometry(width, height);\r\n super(geometry, material);\r\n }\r\n}\r\n","import ViewManager from './ViewManager';\r\n\r\nclass ViewComponentManager\r\n{\r\n constructor()\r\n {\r\n this.components = [];\r\n }\r\n\r\n update()\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n this.components[i].update(ViewManager.transition_handler.current_state_data);\r\n }\r\n }\r\n\r\n register_component(component)\r\n {\r\n this.components.push(component);\r\n }\r\n\r\n get_component_by_name(component_name)\r\n {\r\n for (let i = 0; i < this.components.length; i++)\r\n {\r\n if (this.components[i].name === component_name)\r\n {\r\n return this.components[i];\r\n }\r\n }\r\n console.error('get_component_by_name no component found for: ', component_name);\r\n return undefined;\r\n }\r\n}\r\n\r\nexport default new ViewComponentManager();\r\n","import Time from './Time';\r\nimport Input from './Input';\r\nimport UI from './UI';\r\nimport Debug from './Debug';\r\nimport BaseApplication from './BaseApplication';\r\nimport ViewManager from './view_components/ViewManager';\r\nimport ViewComponentManager from './view_components/ViewComponentManager';\r\n\r\nexport default class RenderLoop\r\n{\r\n constructor(target_application, renderer)\r\n {\r\n target_application = target_application || new BaseApplication();\r\n\r\n this._frame_id = -1;\r\n\r\n this.target_application = target_application;\r\n this.renderer = renderer;\r\n\r\n this.is_running = false;\r\n this.frames_passed = 0;\r\n }\r\n\r\n update()\r\n {\r\n console.log('asd');\r\n if (!this.is_running)\r\n {\r\n return;\r\n }\r\n Time.__update();\r\n\r\n // ###### START CYCLE ######\r\n if (this.frames_passed === 1)\r\n {\r\n this.target_application.on_post_start();\r\n }\r\n\r\n this.target_application.update();\r\n ViewManager.update();\r\n ViewComponentManager.update();\r\n\r\n this.target_application.on_pre_render();\r\n\r\n this.renderer.update(); // render scene\r\n UI.update(); // update after new camera matrix has been calculated\r\n UI.render(this.renderer); // render ui layer on top\r\n Debug.render(); // render debug layer\r\n\r\n this.target_application.on_post_render();\r\n\r\n // ###### END CYCLE #######\r\n Input.clear();\r\n UI.clear();\r\n Debug.clear();\r\n\r\n this._frame_id = requestAnimationFrame(this.update.bind(this));\r\n this.frames_passed++;\r\n }\r\n\r\n start()\r\n {\r\n if (this.is_running) return; // sanity check\r\n\r\n this.renderer.check_for_resize();\r\n\r\n if (this.frames_passed === 0)\r\n {\r\n this.target_application.on_enter();\r\n }\r\n\r\n this.is_running = true;\r\n this.update();\r\n }\r\n\r\n stop()\r\n {\r\n if (this.is_running === false) return; // sanity check\r\n\r\n this.is_running = false;\r\n this.target_application.on_exit();\r\n\r\n cancelAnimationFrame(this._frame_id);\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n this.target_application.on_exit(this);\r\n this.target_application = new_state;\r\n this.target_application.on_enter(this);\r\n }\r\n\r\n dispose()\r\n {\r\n this.stop();\r\n this.frames_passed = 0;\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { TextureLoader as THREETextureLoader } from 'three';\r\n\r\nexport default class TextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREETextureLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (image) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, image);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // This is never called (See THREE.ImageLoader)\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n () =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\n\r\nexport default class GLTFLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEColladaLoader from 'three/examples/jsm/loaders/ColladaLoader.js';\r\n\r\nexport default class DAELoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEColladaLoader.ColladaLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class TextLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { CubeTextureLoader as THREECubeTextureLoader } from 'three';\r\n\r\nexport default class CubemapLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREECubeTextureLoader();\r\n this.loader.setPath(url + '/');\r\n this.urls = [\r\n 'px.png',\r\n 'nx.png',\r\n 'py.png',\r\n 'ny.png',\r\n 'pz.png',\r\n 'nz.png'\r\n ];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.urls, (image) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, image);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n ctx.__set_error('Image could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import { Audio as THREEAudio } from 'three';\r\n\r\nexport default class AudioClip\r\n{\r\n constructor(buffer, loop = true, volume = 1)\r\n {\r\n this.buffer = buffer;\r\n this.loop = loop;\r\n this.volume = volume;\r\n\r\n this.audio = undefined;\r\n }\r\n\r\n init(audio_listener)\r\n {\r\n this.audio = new THREEAudio(audio_listener);\r\n this.audio.setBuffer(this.buffer);\r\n this.audio.setLoop(this.loop);\r\n this.audio.setVolume(this.volume);\r\n }\r\n\r\n play()\r\n {\r\n this.audio.play();\r\n }\r\n\r\n pause()\r\n {\r\n this.audio.pause();\r\n }\r\n\r\n stop()\r\n {\r\n this.audio.stop();\r\n }\r\n\r\n get is_playing()\r\n {\r\n return this.audio.isPlaying;\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport AudioClip from '../components/AudioClip';\r\nimport { AudioLoader as THREEAudioLoader } from 'three';\r\n\r\nexport default class AudioLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, loop = true, volume = 1, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEAudioLoader();\r\n this.loop = loop;\r\n this.volume = volume;\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (buffer) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, new AudioClip(buffer, this.loop, this.volume));\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (error) =>\r\n {\r\n ctx.__set_error('Audio could not be loaded. Maybe wrong name or path, I don\\'t know' + '¯\\\\_(ツ)_/¯', error);\r\n ctx.__loading_ended();\r\n });\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEOBJLoader from 'three/examples/jsm/loaders/OBJLoader.js';\r\n\r\nexport default class OBJLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEOBJLoader.OBJLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FontLoader as TFontLoader } from 'three';\r\n\r\nexport default class FontLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new TFontLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (font) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, font);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREERGBELoader from 'three/examples/jsm/loaders/RGBELoader.js';\r\n\r\nimport { UnsignedByteType as THREEUnsignedByteType } from 'three';\r\n\r\nexport default class RGBETextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREERGBELoader.RGBELoader();\r\n this.loader.setDataType(THREEUnsignedByteType);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (hdr) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, hdr);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { Vector3 as THREEVector3 } from 'three';\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class PointArrayLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (text) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, ctx.parse_path(text));\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n\r\n parse_path(raw_data)\r\n {\r\n let string_array = raw_data.split('\\n');\r\n\r\n if (string_array[string_array.length - 1] === '')\r\n {\r\n string_array.pop();\r\n }\r\n\r\n let positions = [];\r\n\r\n for (let i = 0; i < string_array.length; i += 3)\r\n {\r\n let x = parseFloat(string_array[i + 0]);\r\n let y = parseFloat(string_array[i + 1]);\r\n let z = parseFloat(string_array[i + 2]);\r\n positions.push(new THREEVector3(x, y, z));\r\n }\r\n return positions;\r\n // let curve = new THREE.CatmullRomCurve3(positions);\r\n // return curve.getPoints(100);\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEHDRCubeTextureLoader from 'three/examples/jsm/loaders/HDRCubeTextureLoader.js';\r\nimport { UnsignedByteType } from 'three';\r\n\r\nexport default class HDRCubeTextureLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEHDRCubeTextureLoader.HDRCubeTextureLoader();\r\n this.url_suffix = ['/px.hdr', '/nx.hdr', '/py.hdr', '/ny.hdr', '/pz.hdr', '/nz.hdr'];\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.setPath(this.url)\r\n .setDataType(UnsignedByteType)\r\n .load(this.url_suffix, (hdr) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, hdr);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport * as THREEGLTFLoader from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport * as THREEDRACOLoader from 'three/examples/jsm/loaders/DRACOLoader.js';\r\n\r\nexport default class GLTFDRACOLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEGLTFLoader.GLTFLoader();\r\n this.draco_loader = new THREEDRACOLoader.DRACOLoader();\r\n\r\n this.draco_loader.setDecoderPath(window.draco_decoder_path);\r\n this.draco_loader.setDecoderConfig({ type: 'js' });\r\n this.loader.setDRACOLoader(this.draco_loader);\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg + '\\n\\n\\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource');\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import AbstractLoader from './AbstractLoader';\r\n\r\nimport { FileLoader as THREEFileLoader } from 'three';\r\n\r\nexport default class FileLoader extends AbstractLoader\r\n{\r\n constructor(resource_id, url, size)\r\n {\r\n super(resource_id, url, size);\r\n this.loader = new THREEFileLoader();\r\n }\r\n\r\n on_preloaded_finished(resource_container)\r\n {\r\n let ctx = this;\r\n\r\n this.loader.load(this.url, (gltf) =>\r\n {\r\n resource_container.set_resource(ctx.resource_id, gltf);\r\n\r\n ctx.__update_downloaded_bytes(1, 1);\r\n ctx.__loading_ended();\r\n },\r\n (xhr) =>\r\n {\r\n // if (xhr)\r\n // {\r\n // let total = xhr.total || this.total_bytes;\r\n // ctx.__update_downloaded_bytes(xhr.loaded, total);\r\n // }\r\n },\r\n (msg) =>\r\n {\r\n ctx.__set_error(msg);\r\n ctx.__loading_ended();\r\n }\r\n );\r\n }\r\n}\r\n","import TextureLoader from './TextureLoader';\r\nimport GLTFLoader from './GLTFLoader';\r\nimport DAELoader from './DAELoader';\r\nimport TextLoader from './TextLoader';\r\nimport CubemapLoader from './CubemapLoader';\r\nimport AudioLoader from './AudioLoader';\r\nimport JSONLoader from './JSONLoader';\r\nimport OBJLoader from './OBJLoader';\r\nimport FontLoader from './FontLoader';\r\nimport RGBETextureLoader from './RGBETextureLoader';\r\nimport PointArrayLoader from './PointArrayLoader';\r\nimport HDRCubeTextureLoader from './HDRCubeTextureLoader';\r\nimport GLTFDRACOLoader from './GLTFDRACOLoader';\r\nimport BasisLoader from './BasisLoader';\r\nimport ResourceContainer from '../ResourceContainer';\r\nimport FileLoader from './FileLoader';\r\n\r\nexport default class ResourceBatch\r\n{\r\n constructor(batch_name)\r\n {\r\n this.resource_loaders = [];\r\n this.batch_name = batch_name || 'unnamed batch';\r\n }\r\n\r\n add_texture(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_gltf(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFLoader(resource_id, url, size));\r\n }\r\n\r\n add_basis(resource_id, url, renderer, loader, size)\r\n {\r\n this.resource_loaders.push(new BasisLoader(resource_id, url, renderer, loader, size));\r\n }\r\n\r\n add_gltf_draco(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new GLTFDRACOLoader(resource_id, url, size));\r\n }\r\n\r\n add_dae(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new DAELoader(resource_id, url, size));\r\n }\r\n\r\n add_obj(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new OBJLoader(resource_id, url, size));\r\n }\r\n\r\n add_file(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FileLoader(resource_id, url, size));\r\n }\r\n\r\n add_text(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new TextLoader(resource_id, url, size));\r\n }\r\n\r\n add_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new CubemapLoader(resource_id, url, size));\r\n }\r\n\r\n add_audio(resource_id, url, loop, volume, size)\r\n {\r\n this.resource_loaders.push(new AudioLoader(resource_id, url, loop, volume, size));\r\n }\r\n\r\n add_json(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new JSONLoader(resource_id, url, size));\r\n }\r\n\r\n add_point_array(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new PointArrayLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new RGBETextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_hdr_cubemap(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new HDRCubeTextureLoader(resource_id, url, size));\r\n }\r\n\r\n add_font(resource_id, url, size)\r\n {\r\n this.resource_loaders.push(new FontLoader(resource_id, url, size));\r\n }\r\n\r\n add_loader(loader)\r\n {\r\n this.resource_loaders.push(loader);\r\n }\r\n\r\n load(resource_container)\r\n {\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n this.resource_loaders[i].load(resource_container || ResourceContainer);\r\n }\r\n }\r\n\r\n get loading_finished()\r\n {\r\n let finished = true;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n finished = finished && this.resource_loaders[i].has_finished;\r\n }\r\n return finished;\r\n }\r\n\r\n get has_errors()\r\n {\r\n let has_error = false;\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n has_error = has_error || this.resource_loaders[i].has_error;\r\n }\r\n return has_error;\r\n }\r\n\r\n print_errors()\r\n {\r\n console.error('Batch <' + this.batch_name + '> could not load successfully');\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n if (this.resource_loaders[i].has_error)\r\n {\r\n this.resource_loaders[i].print_error();\r\n }\r\n }\r\n }\r\n\r\n get_progress()\r\n {\r\n return this.get_loaded_bytes() / this.get_total_bytes();\r\n }\r\n\r\n get_loaded_bytes()\r\n {\r\n let loaded_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n loaded_bytes += this.resource_loaders[i].loaded_bytes;\r\n }\r\n\r\n return loaded_bytes;\r\n }\r\n\r\n get_total_bytes()\r\n {\r\n let total_bytes = 1;\r\n\r\n for (let i = 0; i < this.resource_loaders.length; i++)\r\n {\r\n total_bytes += this.resource_loaders[i].total_bytes;\r\n }\r\n\r\n return total_bytes;\r\n }\r\n}\r\n","\r\nimport CanvasDrawer from './CanvasDrawer';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class SimpleTextDrawer extends CanvasDrawer\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.text_margin = new Vector2(2, 0);\r\n }\r\n\r\n __draw(text, ctxOptions, canvas, ctx)\r\n {\r\n ctx.font = ctxOptions.font;\r\n\r\n let text_size = this.get_text_size(text, ctxOptions.font);\r\n // canvas.width = Math.ceilPowerOfTwo(text_size.x+this.text_margin.x*2);\r\n // canvas.height = Math.ceilPowerOfTwo(text_size.y+ this.text_margin.y*2);\r\n canvas.width = Math.ceil(text_size.x + this.text_margin.x * 2);\r\n canvas.height = Math.ceil(text_size.y + this.text_margin.y * 2);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // turn this on for debugging\r\n ctx.globalAlpha = 0.0;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.font = ctxOptions.font;\r\n ctx.fillStyle = ctxOptions.font_color || '#000000';\r\n ctx.textBaseline = 'middle';\r\n\r\n ctx.textAlign = ctxOptions.textAlign || 'center';\r\n if (ctx.textAlign === 'center')\r\n {\r\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\r\n }\r\n else\r\n {\r\n ctx.fillText(text, 0, canvas.height / 2);\r\n }\r\n }\r\n}\r\n","import ViewComponentManager from './ViewComponentManager';\r\n\r\nexport default class ViewComponent\r\n{\r\n constructor(name)\r\n {\r\n this.name = name;\r\n this.container = undefined;\r\n\r\n ViewComponentManager.register_component(this);\r\n }\r\n\r\n start(container)\r\n {\r\n this.container = container;\r\n }\r\n\r\n on_enter()\r\n {\r\n this.container.classList.remove('hidden');\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n on_exit()\r\n {\r\n this.container.classList.add('hidden');\r\n }\r\n\r\n set_opacity(opacity)\r\n {\r\n this.container.style.opacity = opacity;\r\n }\r\n}\r\n","export default class ArrayUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n static merge_from_to(source, target)\r\n {\r\n target.push.apply(target, source);\r\n }\r\n\r\n static expand_vec3_array(array, size)\r\n {\r\n let items_left_count = size - array.length;\r\n\r\n for (let i = 0; i < items_left_count; i++)\r\n {\r\n array.push(array[i].clone());\r\n }\r\n }\r\n\r\n static remove_elem(array, elem)\r\n {\r\n let index = array.indexOf(elem);\r\n if (index > -1)\r\n {\r\n array.splice(index, 1);\r\n }\r\n }\r\n\r\n static get_closest_point(points, target)\r\n {\r\n let closest_point = points[0];\r\n let closest_distance = closest_point.distanceTo(target);\r\n for (let i = 1; i < points.length; i++)\r\n {\r\n if (points[i].distanceTo(target) < closest_distance)\r\n {\r\n closest_point = points[i];\r\n closest_distance = points[i].distanceTo(target);\r\n }\r\n }\r\n return closest_point;\r\n }\r\n\r\n static object_values_to_array(obj)\r\n {\r\n let ids = Object.keys(obj);\r\n let arr = [];\r\n for (let i = 0; i < ids.length; i++)\r\n {\r\n arr.push(obj[ids[i]]);\r\n }\r\n return arr;\r\n }\r\n}\r\n","import { Line3, Plane, Quaternion, Sphere, Vector3 } from 'three';\r\n\r\nexport default class FrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n let v_fov = Math.degToRad(vertical_fov / 2);\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n let up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n let down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n let left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n let right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n let camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n let sphere_center = this.sphere.center.clone();\r\n\r\n let pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n let far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n let up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n let down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n let left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n let right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n let inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n let up_line_intersection = new Vector3();\r\n let down_line_intersection = new Vector3();\r\n\r\n let left_line_intersection = new Vector3();\r\n let right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n let new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n let new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n let new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n let new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n let vertical_min = Math.min(new_up_distance, new_down_distance);\r\n let horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n let min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n let forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n let closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n let vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n let horizontal_offset = this.get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n let closest_up_point = undefined;\r\n let closest_down_point = undefined;\r\n\r\n let up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n let up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n let down_line_intersection = new Vector3();\r\n let up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n let down_dist = down_line_intersection.distanceTo(points[i]);\r\n let up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n closest_up_point = points[i];\r\n }\r\n }\r\n\r\n console.log(closest_up_point, closest_down_point);\r\n\r\n let correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_hozirontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n let closest_right_point = undefined;\r\n let closest_left_point = undefined;\r\n\r\n let right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n let right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n let left_line_intersection = new Vector3();\r\n let right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n let left_dist = left_line_intersection.distanceTo(points[i]);\r\n let right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n closest_right_point = points[i];\r\n }\r\n }\r\n\r\n let correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n console.log(closest_right_point, closest_left_point);\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n let up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n let down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n let left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n let right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n let distV = height / Math.tan(v_fov);\r\n let distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\n\r\nexport default class GeometryUtilities\r\n{\r\n static convert_to_non_indexed_geometry(geometry_buffer)\r\n {\r\n let indices = geometry_buffer.index;\r\n let positions = geometry_buffer.getAttribute('position');\r\n\r\n let bar_coordinates = [];\r\n let vertices = [];\r\n\r\n for (let i = 0; i < indices.count; i += 3)\r\n {\r\n // VERTEX 1\r\n vertices.push(positions.getX(indices.array[i + 0]));\r\n vertices.push(positions.getY(indices.array[i + 0]));\r\n vertices.push(positions.getZ(indices.array[i + 0]));\r\n\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 2\r\n\r\n vertices.push(positions.getX(indices.array[i + 1]));\r\n vertices.push(positions.getY(indices.array[i + 1]));\r\n vertices.push(positions.getZ(indices.array[i + 1]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n // VERTEX 3\r\n\r\n vertices.push(positions.getX(indices.array[i + 2]));\r\n vertices.push(positions.getY(indices.array[i + 2]));\r\n vertices.push(positions.getZ(indices.array[i + 2]));\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n\r\n let geometry = new BufferGeometry();\r\n // geometry.setAttribute('barycentric', new BufferAttribute( new Float32Array(bar_coordinates), 3 ));\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));\r\n GeometryUtilities.add_barycentric_attribute(geometry);\r\n return geometry;\r\n }\r\n\r\n static add_barycentric_attribute(non_indexed_geometry_buffer)\r\n {\r\n let bar_coordinates = [];\r\n let positions = non_indexed_geometry_buffer.getAttribute('position');\r\n\r\n for (let i = 0; i < positions.count; i += 3)\r\n {\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n bar_coordinates.push(0);\r\n\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(0);\r\n bar_coordinates.push(1);\r\n }\r\n non_indexed_geometry_buffer.setAttribute('barycentric', new BufferAttribute(new Float32Array(bar_coordinates), 3));\r\n }\r\n}\r\n","import { Vector4 } from 'three';\r\n\r\nexport default class ImageUtilities\r\n{\r\n constructor()\r\n { }\r\n\r\n static get_image_data(image)\r\n {\r\n let canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n\r\n let context = canvas.getContext('2d');\r\n context.drawImage(image, 0, 0);\r\n\r\n return context.getImageData(0, 0, image.width, image.height);\r\n }\r\n\r\n static get_pixel(imagedata, x, y)\r\n {\r\n let position = (x + imagedata.width * y) * 4;\r\n let data = imagedata.data;\r\n return new Vector4(data[position + 0], data[position + 1], data[position + 2], data[position + 3]);\r\n }\r\n}\r\n","class MeshSampler\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n sample(geometry, sample_count)\r\n {\r\n let face_areas = [];\r\n\r\n let min_area = 99999999;\r\n for (let i = 0; i < geometry.faces.length; i++)\r\n {\r\n let area = this.get_face_area(geometry.faces[i], geometry.vertices);\r\n min_area = Math.min(area, min_area);\r\n face_areas.push(area);\r\n }\r\n\r\n let normalized_faces_array = this.get_uniform_face_distribution(face_areas, min_area, geometry.faces);\r\n let selected_faces = this.select_random_faces(normalized_faces_array, sample_count);\r\n let sampled_data = this.sample_data_from_faces(selected_faces, geometry.vertices);\r\n return sampled_data;\r\n }\r\n\r\n sample_data_from_faces(faces, vertices)\r\n {\r\n let sampled_points = [];\r\n let sampled_normals = [];\r\n for (let i = 0; i < faces.length; i++)\r\n {\r\n let face = faces[i];\r\n\r\n let w1 = Math.random();\r\n let w2 = Math.random();\r\n\r\n sampled_points.push(this.sample_point_in_face(w1, w2, vertices[face.a], vertices[face.b], vertices[face.c]).clone());\r\n if (sampled_normals && face.normal)\r\n {\r\n sampled_normals.push(face.normal.clone());\r\n }\r\n }\r\n return { points: sampled_points, normals: sampled_normals };\r\n }\r\n\r\n select_random_faces(faces, amount)\r\n {\r\n let selected_faces = [];\r\n for (let i = 0; i < amount; i++)\r\n {\r\n let random = parseInt(Math.random() * (faces.length - 1));\r\n let selected_face = faces[random];\r\n\r\n selected_faces.push(selected_face);\r\n }\r\n\r\n return selected_faces;\r\n }\r\n\r\n get_uniform_face_distribution(face_areas, minimum_area, faces)\r\n {\r\n let extended_triangle_indices = [];\r\n for (let i = 0; i < face_areas.length; i++)\r\n {\r\n face_areas[i] /= minimum_area;\r\n let repetitions_needed = parseInt(Math.round(face_areas[i]));\r\n for (let j = 0; j < repetitions_needed; j++)\r\n {\r\n extended_triangle_indices.push(faces[i]);\r\n }\r\n }\r\n return extended_triangle_indices;\r\n }\r\n\r\n get_face_area(face, vertices)\r\n {\r\n let v1 = vertices[face.a].clone();\r\n let v2 = vertices[face.b].clone();\r\n let v3 = vertices[face.c].clone();\r\n\r\n let vec1 = v2.clone().sub(v1);\r\n let vec2 = v3.clone().sub(v1);\r\n return vec1.cross(vec2).length() / 2;\r\n }\r\n\r\n sample_point_in_face(w1, w2, v1, v2, v3)\r\n {\r\n if (w1 + w2 > 1)\r\n {\r\n w1 = 1.0 - w1;\r\n w2 = 1.0 - w2;\r\n }\r\n\r\n let w3 = 1.0 - (w1 + w2);\r\n\r\n return v1.clone().multiplyScalar(w1).add(v2.clone().multiplyScalar(w2)).add(v3.clone().multiplyScalar(w3));\r\n }\r\n}\r\n\r\nexport default new MeshSampler();\r\n","import { Mesh } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { Skeleton } from 'three';\r\n\r\nclass ModelUtilities\r\n{\r\n get_mesh(scene, result_callback)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n if (child.geometry)\r\n {\r\n child.geometry = new BufferGeometry().fromGeometry(child.geometry);\r\n }\r\n result_callback(child);\r\n }\r\n });\r\n }\r\n\r\n get_geometries(scene)\r\n {\r\n let geometries = [];\r\n\r\n this.get_mesh(scene, (child) =>\r\n {\r\n geometries.push(child.geometry);\r\n });\r\n return geometries;\r\n }\r\n\r\n assign_material(scene, material, name)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n // assign to all if no name is given\r\n if (name === undefined)\r\n {\r\n child.material = material;\r\n }\r\n else\r\n {\r\n // if name is given, assign only to that\r\n if (child.name === name)\r\n {\r\n child.material = material;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n clone_animated_gltf(gltf)\r\n {\r\n const clone = {\r\n animations: gltf.animations,\r\n scene: gltf.scene.clone(true)\r\n };\r\n\r\n const skinnedMeshes = {};\r\n\r\n gltf.scene.traverse(node =>\r\n {\r\n if (node.isSkinnedMesh)\r\n {\r\n skinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n const cloneBones = {};\r\n const cloneSkinnedMeshes = {};\r\n\r\n clone.scene.traverse(node =>\r\n {\r\n if (node.isBone)\r\n {\r\n cloneBones[node.name] = node;\r\n }\r\n\r\n if (node.isSkinnedMesh)\r\n {\r\n cloneSkinnedMeshes[node.name] = node;\r\n }\r\n });\r\n\r\n for (let name in skinnedMeshes)\r\n {\r\n const skinnedMesh = skinnedMeshes[name];\r\n const skeleton = skinnedMesh.skeleton;\r\n const cloneSkinnedMesh = cloneSkinnedMeshes[name];\r\n\r\n const orderedCloneBones = [];\r\n\r\n for (let i = 0; i < skeleton.bones.length; ++i)\r\n {\r\n const cloneBone = cloneBones[skeleton.bones[i].name];\r\n orderedCloneBones.push(cloneBone);\r\n }\r\n\r\n cloneSkinnedMesh.bind(\r\n new Skeleton(orderedCloneBones, skeleton.boneInverses),\r\n cloneSkinnedMesh.matrixWorld);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n set_shadow_config(scene, cast, receive)\r\n {\r\n scene.traverse((child) =>\r\n {\r\n if (child instanceof Mesh)\r\n {\r\n child.castShadow = cast;\r\n child.receiveShadow = receive;\r\n }\r\n });\r\n }\r\n\r\n __find_object(scene, object_name, result_callback)\r\n {\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n result_callback(obj);\r\n }\r\n });\r\n }\r\n\r\n get_object(scene, object_name)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.name === object_name)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n\r\n get_object_by_type(scene, object_type)\r\n {\r\n let object = undefined;\r\n scene.traverse((obj) =>\r\n {\r\n if (obj.constructor.name === object_type)\r\n {\r\n object = obj;\r\n }\r\n });\r\n return object;\r\n }\r\n}\r\n\r\nexport default new ModelUtilities();\r\n","export default class ObjectUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Changes XML to JSON\r\n static xml_to_json(xml)\r\n {\r\n // Create the return object\r\n let obj = {};\r\n\r\n if (xml.nodeType === 1)\r\n { // element\r\n // do attributes\r\n if (xml.attributes.length > 0)\r\n {\r\n obj['@attributes'] = {};\r\n for (let j = 0; j < xml.attributes.length; j++)\r\n {\r\n let attribute = xml.attributes.item(j);\r\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\r\n }\r\n }\r\n }\r\n else if (xml.nodeType === 3)\r\n { // text\r\n obj = xml.nodeValue;\r\n }\r\n\r\n // do children\r\n if (xml.hasChildNodes())\r\n {\r\n for (let i = 0; i < xml.childNodes.length; i++)\r\n {\r\n let item = xml.childNodes.item(i);\r\n let nodeName = item.nodeName;\r\n if (typeof (obj[nodeName]) === 'undefined')\r\n {\r\n obj[nodeName] = this.xml_to_json(item);\r\n }\r\n else\r\n {\r\n if (typeof (obj[nodeName].push) === 'undefined')\r\n {\r\n let old = obj[nodeName];\r\n obj[nodeName] = [];\r\n obj[nodeName].push(old);\r\n }\r\n obj[nodeName].push(this.xml_to_json(item));\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n}\r\n","export default class TimeUtilities\r\n{\r\n constructor()\r\n {}\r\n\r\n // Converts a time string (00:00:00.45) into miliseconds\r\n time_str_to_ms(time_str)\r\n {\r\n time_str = time_str.split(':');\r\n\r\n let hours = Number(time_str[0]);\r\n hours = hours * 60 * 60 * 1000;\r\n\r\n let minutes = Number(time_str[1]);\r\n minutes = minutes * 60 * 1000;\r\n\r\n let seconds = Number(time_str[2]);\r\n seconds = seconds * 1000;\r\n\r\n return hours + minutes + seconds;\r\n }\r\n}\r\n","import { Vector3, Plane, Quaternion, Sphere, Math as TMath, Line3 } from 'three';\r\nexport default class PerspectiveFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n this.sphere = new Sphere();\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n this.sphere.setFromPoints(points);\r\n\r\n let v_fov = TMath.degToRad(vertical_fov / 2);\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n let up_plane_normal = this.get_up_plane_normal(camera_quaternion, v_fov);\r\n let down_plane_normal = this.get_down_plane_normal(camera_quaternion, v_fov);\r\n let left_plane_normal = this.get_left_plane_normal(camera_quaternion, h_fov);\r\n let right_plane_normal = this.get_right_plane_normal(camera_quaternion, h_fov);\r\n\r\n let camera_forward_dir = new Vector3(0, 0, -1).applyQuaternion(camera_quaternion);\r\n\r\n let sphere_center = this.sphere.center.clone();\r\n\r\n let pull_back_distance = this.get_distance_to_fit_rect(this.sphere.radius * 2, this.sphere.radius * 2, vertical_fov, aspect);\r\n let far_pos = sphere_center.clone().add(camera_forward_dir.clone().multiplyScalar(pull_back_distance * -1));\r\n\r\n let up_plane = new Plane().setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n let down_plane = new Plane().setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n let left_plane = new Plane().setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n let right_plane = new Plane().setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n this.apply_center_correction_to_pos(far_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane);\r\n\r\n up_plane.setFromNormalAndCoplanarPoint(up_plane_normal, far_pos);\r\n down_plane.setFromNormalAndCoplanarPoint(down_plane_normal, far_pos);\r\n\r\n left_plane.setFromNormalAndCoplanarPoint(left_plane_normal, far_pos);\r\n right_plane.setFromNormalAndCoplanarPoint(right_plane_normal, far_pos);\r\n\r\n let closest_distance = Infinity;\r\n\r\n let inverse_dir = camera_forward_dir.clone().multiplyScalar(pull_back_distance * -2);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let line = new Line3(points[i].clone(), points[i].clone().add(inverse_dir));\r\n\r\n let up_line_intersection = new Vector3();\r\n let down_line_intersection = new Vector3();\r\n\r\n let left_line_intersection = new Vector3();\r\n let right_line_intersection = new Vector3();\r\n\r\n up_plane.intersectLine(line, up_line_intersection);\r\n down_plane.intersectLine(line, down_line_intersection);\r\n\r\n left_plane.intersectLine(line, left_line_intersection);\r\n right_plane.intersectLine(line, right_line_intersection);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('down intersection not found', i);\r\n }\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n let new_up_distance = points[i].clone().sub(up_line_intersection).length();\r\n let new_down_distance = points[i].clone().sub(down_line_intersection).length();\r\n\r\n let new_left_distance = points[i].clone().sub(left_line_intersection).length();\r\n let new_right_distance = points[i].clone().sub(right_line_intersection).length();\r\n\r\n let vertical_min = Math.min(new_up_distance, new_down_distance);\r\n let horizontal_min = Math.min(new_left_distance, new_right_distance);\r\n\r\n let min = Math.min(vertical_min, horizontal_min);\r\n\r\n if (min < closest_distance)\r\n {\r\n closest_distance = min;\r\n }\r\n }\r\n\r\n let forward_correction = camera_forward_dir.clone().multiplyScalar(closest_distance);\r\n let closest_position = far_pos.clone().add(forward_correction);\r\n\r\n return closest_position;\r\n }\r\n\r\n apply_center_correction_to_pos(target_pos, points, camera_quaternion, up_plane, down_plane, left_plane, right_plane)\r\n {\r\n let vertical_offset = this.get_vertical_correction(points, down_plane, up_plane, camera_quaternion);\r\n let horizontal_offset = this.get_horizontal_correction(points, left_plane, right_plane, camera_quaternion);\r\n\r\n target_pos.add(vertical_offset);\r\n target_pos.add(horizontal_offset);\r\n }\r\n\r\n get_vertical_correction(points, down_plane, up_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_up_plane = Infinity;\r\n let closest_distance_to_down_plane = Infinity;\r\n // let closest_up_point = undefined;\r\n // let closest_down_point = undefined;\r\n\r\n let up_dir = new Vector3(0, 1, 0).applyQuaternion(camera_quaternion);\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let down_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(-5000000)));\r\n let up_line = new Line3(points[i].clone(), points[i].clone().add(up_dir.clone().multiplyScalar(5000000)));\r\n\r\n let down_line_intersection = new Vector3();\r\n let up_line_intersection = new Vector3();\r\n\r\n down_plane.intersectLine(down_line, down_line_intersection);\r\n up_plane.intersectLine(up_line, up_line_intersection);\r\n\r\n let down_dist = down_line_intersection.distanceTo(points[i]);\r\n let up_dist = up_line_intersection.distanceTo(points[i]);\r\n\r\n if (up_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical up intersection not found', i);\r\n }\r\n if (down_line_intersection.length() < 0.0001)\r\n {\r\n console.log('vertical down intersection not found', i);\r\n }\r\n\r\n if (down_dist < closest_distance_to_down_plane)\r\n {\r\n closest_distance_to_down_plane = down_dist;\r\n // closest_down_point = points[i];\r\n }\r\n if (up_dist < closest_distance_to_up_plane)\r\n {\r\n closest_distance_to_up_plane = up_dist;\r\n // closest_up_point = points[i];\r\n }\r\n }\r\n\r\n let correction = (closest_distance_to_up_plane - closest_distance_to_down_plane) / 2;\r\n\r\n // console.log(\"vertical_correction\", correction)\r\n return up_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_horizontal_correction(points, left_plane, right_plane, camera_quaternion)\r\n {\r\n let closest_distance_to_right_plane = Infinity;\r\n let closest_distance_to_left_plane = Infinity;\r\n // let closest_right_point = undefined;\r\n // let closest_left_point = undefined;\r\n\r\n let right_dir = new Vector3(1, 0, 0).applyQuaternion(camera_quaternion);\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n let left_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(-5000000)));\r\n let right_line = new Line3(points[i].clone(), points[i].clone().add(right_dir.clone().multiplyScalar(5000000)));\r\n\r\n let left_line_intersection = new Vector3();\r\n let right_line_intersection = new Vector3();\r\n\r\n left_plane.intersectLine(left_line, left_line_intersection);\r\n right_plane.intersectLine(right_line, right_line_intersection);\r\n\r\n let left_dist = left_line_intersection.distanceTo(points[i]);\r\n let right_dist = right_line_intersection.distanceTo(points[i]);\r\n\r\n if (left_line_intersection.length() < 0.0001)\r\n {\r\n console.log('left intersection not found', i);\r\n }\r\n if (right_line_intersection.length() < 0.0001)\r\n {\r\n console.log('right intersection not found', i);\r\n }\r\n\r\n if (left_dist < closest_distance_to_left_plane)\r\n {\r\n closest_distance_to_left_plane = left_dist;\r\n // closest_left_point = points[i];\r\n }\r\n if (right_dist < closest_distance_to_right_plane)\r\n {\r\n closest_distance_to_right_plane = right_dist;\r\n // closest_right_point = points[i];\r\n }\r\n }\r\n\r\n let correction = (closest_distance_to_right_plane - closest_distance_to_left_plane) / 2;\r\n // console.log(\"horizontal_correction\", correction)\r\n\r\n return right_dir.clone().multiplyScalar(-correction);\r\n }\r\n\r\n get_up_plane_normal(camera_quaternion, v_fov)\r\n {\r\n let up_plane_normal = new Vector3(0, -1, 0);\r\n up_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), v_fov));\r\n up_plane_normal.applyQuaternion(camera_quaternion);\r\n return up_plane_normal;\r\n }\r\n\r\n get_down_plane_normal(camera_quaternion, v_fov)\r\n {\r\n let down_plane_normal = new Vector3(0, 1, 0);\r\n down_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -v_fov));\r\n down_plane_normal.applyQuaternion(camera_quaternion);\r\n return down_plane_normal;\r\n }\r\n\r\n get_left_plane_normal(camera_quaternion, h_fov)\r\n {\r\n let left_plane_normal = new Vector3(1, 0, 0);\r\n left_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), h_fov));\r\n left_plane_normal.applyQuaternion(camera_quaternion);\r\n return left_plane_normal;\r\n }\r\n\r\n get_right_plane_normal(camera_quaternion, h_fov)\r\n {\r\n let right_plane_normal = new Vector3(-1, 0, 0);\r\n right_plane_normal.applyQuaternion(new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), -h_fov));\r\n right_plane_normal.applyQuaternion(camera_quaternion);\r\n return right_plane_normal;\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n let distV = height / Math.tan(v_fov);\r\n let distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import { Vector3, Box3 } from 'three';\r\n\r\nexport default class OrthographicFrustumPointFitter\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n fit_points(points, camera_quaternion, vertical_fov, aspect)\r\n {\r\n let inverse_camera_quat = camera_quaternion.clone().inverse();\r\n\r\n let inverted_points = [];\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n inverted_points.push(points[i].clone().applyQuaternion(inverse_camera_quat));\r\n }\r\n\r\n let box = new Box3().setFromPoints(inverted_points);\r\n let size = new Vector3();\r\n box.getSize(size);\r\n\r\n let distance = this.get_distance_to_fit_rect(size.x / 2, size.y / 2, vertical_fov, aspect);\r\n\r\n let center = new Vector3();\r\n box.getCenter(center);\r\n\r\n center.applyQuaternion(camera_quaternion);\r\n\r\n return {\r\n center: center,\r\n distance_to_center: distance\r\n };\r\n }\r\n\r\n get_distance_to_fit_rect(width, height, vertical_fov, aspect)\r\n {\r\n let v_fov = (vertical_fov / 2) * Math.PI / 180;\r\n let h_fov = (2 * Math.atan(Math.tan(v_fov) * aspect)) / 2;\r\n\r\n let distV = height / Math.tan(v_fov);\r\n let distH = width / Math.tan(h_fov);\r\n return Math.max(Math.abs(distH), Math.abs(distV));\r\n }\r\n}\r\n","import grid_frag from '../shaders/grid/grid.frag';\r\nimport grid_vert from '../shaders/grid/grid.vert';\r\nimport GeometryUtilities from '../utilities/GeometryUtilities';\r\n\r\nimport { Mesh } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\nimport { PlaneBufferGeometry } from 'three';\r\n\r\nexport default class Grid extends Mesh\r\n{\r\n constructor()\r\n {\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n _Color: { value: new Color('#919191') }\r\n },\r\n vertexShader: grid_vert,\r\n fragmentShader: grid_frag,\r\n extensions: { derivatives: true },\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n let plane_geometry = new PlaneBufferGeometry(100, 100, 100, 100);\r\n\r\n let non_indexed_geometry = GeometryUtilities.convert_to_non_indexed_geometry(plane_geometry);\r\n\r\n super(non_indexed_geometry, material);\r\n\r\n this.rotation.x = -3.14 / 2;\r\n }\r\n}\r\n","import line_vs from '../shaders/basic_line/basic_line.vert';\r\nimport line_fs from '../shaders/basic_line/basic_line.frag';\r\n\r\nimport { Mesh } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { BufferGeometry } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { Color } from 'three';\r\n\r\nexport default class Line extends Mesh\r\n{\r\n constructor(points)\r\n {\r\n let geometry = new BufferGeometry();\r\n geometry.setAttribute('position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('next_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('previous_position', new BufferAttribute(new Float32Array([]), 3));\r\n geometry.setAttribute('orientation', new BufferAttribute(new Float32Array([]), 1));\r\n geometry.setAttribute('coverage', new BufferAttribute(new Float32Array([]), 1));\r\n\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n _Thickness: { value: 0.2 },\r\n _Length: { value: 0 },\r\n _ElapsedTime: { value: 0 },\r\n _Color: { value: new Color('#FF0000') }\r\n },\r\n vertexShader: line_vs,\r\n fragmentShader: line_fs,\r\n transparent: true,\r\n depthWrite: false,\r\n extensions: { derivatives: true }\r\n\r\n });\r\n\r\n super(geometry, material);\r\n\r\n if (points)\r\n {\r\n this.setup(points);\r\n }\r\n }\r\n\r\n setup(points)\r\n {\r\n let vertices = [];\r\n let next_position = [];\r\n let previous_position = [];\r\n let orientation = [];\r\n let coverage = [];\r\n let accumulated_length = 0;\r\n\r\n for (let i = 0; i < points.length; i++)\r\n {\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(1);\r\n\r\n vertices.push(points[i].x);\r\n vertices.push(points[i].y);\r\n vertices.push(points[i].z);\r\n orientation.push(-1);\r\n\r\n let next_point = this.__get_next_position(points, i);\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n next_position.push(next_point.x);\r\n next_position.push(next_point.y);\r\n next_position.push(next_point.z);\r\n\r\n let previous_point = this.__get_previous_position(points, i);\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n previous_position.push(previous_point.x);\r\n previous_position.push(previous_point.y);\r\n previous_position.push(previous_point.z);\r\n\r\n coverage.push(accumulated_length);\r\n coverage.push(accumulated_length);\r\n\r\n if (i < points.length - 1)\r\n {\r\n accumulated_length += points[i].distanceTo(next_point);\r\n }\r\n }\r\n let vertexList = new Float32Array(vertices);\r\n let nextPositionList = new Float32Array(next_position);\r\n let previousPositionList = new Float32Array(previous_position);\r\n let orientationList = new Float32Array(orientation);\r\n let coverageList = new Float32Array(coverage);\r\n\r\n let indices = [];\r\n for (let i = 0; i < ((vertexList.length / 3) - 2) / 2; i++)\r\n {\r\n let index = (i * 2) + 1;\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index - 1);\r\n\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 1);\r\n }\r\n\r\n this.geometry.setIndex(indices);\r\n this.geometry.getAttribute('position').copy(new BufferAttribute(vertexList, 3));\r\n this.geometry.getAttribute('next_position').copy(new BufferAttribute(nextPositionList, 3));\r\n this.geometry.getAttribute('previous_position').copy(new BufferAttribute(previousPositionList, 3));\r\n this.geometry.getAttribute('orientation').copy(new BufferAttribute(orientationList, 1));\r\n this.geometry.getAttribute('coverage').copy(new BufferAttribute(coverageList, 1));\r\n\r\n this.geometry.getAttribute('position').needsUpdate = true;\r\n this.geometry.getAttribute('next_position').needsUpdate = true;\r\n this.geometry.getAttribute('previous_position').needsUpdate = true;\r\n this.geometry.getAttribute('orientation').needsUpdate = true;\r\n this.geometry.getAttribute('coverage').needsUpdate = true;\r\n\r\n this.material.uniforms._Length.value = accumulated_length;\r\n this._length = accumulated_length;\r\n }\r\n\r\n set thickness(value)\r\n {\r\n this.material.uniforms._Thickness.value = value;\r\n }\r\n\r\n get thickness()\r\n {\r\n return this.material.uniforms._Thickness.value;\r\n }\r\n\r\n __get_previous_position(points, i)\r\n {\r\n if (i === 0)\r\n {\r\n return points[1].clone().sub(points[0]).multiplyScalar(-1).add(points[0]);\r\n }\r\n else\r\n {\r\n return points[i - 1];\r\n }\r\n }\r\n\r\n __get_next_position(points, i)\r\n {\r\n if (i === points.length - 1)\r\n {\r\n return points[points.length - 2].clone().sub(points[points.length - 1]).multiplyScalar(-1).add(points[points.length - 1]);\r\n }\r\n else\r\n {\r\n return points[i + 1];\r\n }\r\n }\r\n\r\n update()\r\n {\r\n }\r\n\r\n distance()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n total_length()\r\n {\r\n return this.accumulated_length;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n if (this.parent)\r\n {\r\n this.parent.remove(this);\r\n }\r\n }\r\n\r\n set color(col)\r\n {\r\n this.material.uniforms._Color.value.set(col);\r\n }\r\n\r\n get color()\r\n {\r\n return this.material.uniforms._Color.value;\r\n }\r\n\r\n copy_color(col)\r\n {\r\n this.material.uniforms._Color.value.copy(col);\r\n }\r\n}\r\n","import basic_texture_vert from '../shaders/basic_texture/basic_texture.vert';\r\nimport basic_texture_frag from '../shaders/basic_texture/basic_texture.frag';\r\n\r\nimport { Mesh } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { ShaderMaterial } from 'three';\r\nimport { DoubleSide } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class WorldImage extends Mesh\r\n{\r\n constructor(texture, pivot)\r\n {\r\n pivot = pivot || new Vector2(0, 0);\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n _MainTex: { value: texture },\r\n _ScreenAligned: { value: 0 },\r\n _Scale: { value: 1 },\r\n _Opacity: { value: 1 }\r\n },\r\n vertexShader: basic_texture_vert,\r\n fragmentShader: basic_texture_frag,\r\n transparent: true,\r\n depthWrite: false,\r\n side: DoubleSide\r\n });\r\n let geometry = new PlaneGeometry(1, 1, 1);\r\n geometry.translate(-pivot.x / 2, -pivot.y / 2, 0);\r\n let current_scale = texture.image.width / texture.image.height;\r\n geometry.scale(current_scale, 1, 1);\r\n super(geometry, material);\r\n this.current_scale = current_scale;\r\n this.geometry.computeBoundingBox();\r\n\r\n this.tmp_bb_size = new Vector3();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n update_texture()\r\n {\r\n this.material.uniforms._MainTex.value.needsUpdate = true;\r\n let img = this.material.uniforms._MainTex.value.image;\r\n\r\n this.geometry.scale(1 / this.current_scale, 1, 1);\r\n this.current_scale = img.width / img.height;\r\n this.geometry.scale(this.current_scale, 1, 1);\r\n this.geometry.computeBoundingBox();\r\n this.geometry.boundingBox.getSize(this.tmp_bb_size);\r\n }\r\n\r\n get size()\r\n {\r\n return this.tmp_bb_size.clone().multiplyScalar(this.scale.x);\r\n }\r\n\r\n set size(value)\r\n {\r\n this.scale.set(value, value, value);\r\n this.material.uniforms._Scale.value = value;\r\n }\r\n\r\n set screen_aligned(boolean)\r\n {\r\n this.material.uniforms._ScreenAligned.value = boolean === true ? 1 : 0;\r\n }\r\n\r\n get screen_aligned()\r\n {\r\n return this.material.uniforms._ScreenAligned.value === 1;\r\n }\r\n\r\n set opacity(opacity)\r\n {\r\n this.material.uniforms._Opacity.value = opacity;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.material.uniforms._Opacity.value;\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.parent.remove(this);\r\n this.material.uniforms._MainTex.value.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n","import WorldImage from './WorldImage';\r\nimport SimpleTextDrawer from '../canvas_drawer/SimpleTextDrawer';\r\n\r\nimport { LinearMipMapLinearFilter } from 'three';\r\nimport { LinearFilter } from 'three';\r\n\r\nexport default class Text2D extends WorldImage\r\n{\r\n constructor(text, font, color, pivot, is_static)\r\n {\r\n let simple_text_drawer = new SimpleTextDrawer(is_static);\r\n\r\n let draw_settings = {\r\n font: font,\r\n font_color: color || '#000000'\r\n };\r\n let canvas_texture = simple_text_drawer.draw_on_texture(text, draw_settings);\r\n\r\n canvas_texture.minFilter = LinearMipMapLinearFilter;\r\n canvas_texture.minFilter = LinearFilter;\r\n canvas_texture.needsUpdate = true;\r\n super(canvas_texture, pivot);\r\n\r\n this.simple_text_drawer = simple_text_drawer;\r\n this.canvas_texture = canvas_texture;\r\n this.draw_settings = draw_settings;\r\n }\r\n\r\n set text(value)\r\n {\r\n this.simple_text_drawer.draw_canvas(value, this.draw_settings);\r\n this.update_texture();\r\n }\r\n\r\n get text()\r\n {\r\n return 'not implemented';\r\n }\r\n}\r\n","import vert from '../shaders/ui_element/ui_element.vert';\r\nimport frag from '../shaders/ui_element/ui_element.frag';\r\nimport BaseShaderMaterial from '../materials/BaseShaderMaterial';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class UIElementMaterial extends BaseShaderMaterial\r\n{\r\n constructor(intensity = 1)\r\n {\r\n super(vert, frag, {\r\n _MainTex: { value: undefined },\r\n _ScreenSize: { value: new Vector2(Screen.width, Screen.height) },\r\n _TextureSize: { value: new Vector2() },\r\n _PixelOffset: { value: new Vector2(0, 0) },\r\n _NDC: { value: new Vector3() },\r\n _PivotPoint: { value: new Vector2() },\r\n _DepthOffset: { value: 0 }\r\n });\r\n this.transparent = true;\r\n this.depthWrite = false;\r\n this.depthTest = false;\r\n }\r\n}\r\n","import { Vector2 } from 'three';\r\n\r\nexport default class ScreenSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n return this.tmp_vec.set(position.x, position.y);\r\n }\r\n}\r\n","import CameraManager from '../../CameraManager';\r\n\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\n\r\nexport default class WorldSpacePosition\r\n{\r\n constructor()\r\n {\r\n this.tmp_vec3 = new Vector3();\r\n this.tmp_vec2 = new Vector2();\r\n }\r\n\r\n get_pos_NDC(position)\r\n {\r\n this.tmp_vec3.copy(position);\r\n this.tmp_vec3.project(CameraManager.current);\r\n\r\n return this.tmp_vec2.set(this.tmp_vec3.x, this.tmp_vec3.y);\r\n }\r\n}\r\n","export default class UIElementState\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n\r\n }\r\n\r\n on_enter(ui_element)\r\n {}\r\n\r\n on_exit(ui_element)\r\n {}\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnIdle extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_enter_state);\r\n }\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseEnter extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_enter();\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n ui_element.set_state(ui_element._on_hover_state);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseExit extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n ui_element.on_mouse_exit();\r\n ui_element.set_state(ui_element._on_idle_state);\r\n }\r\n}\r\n","import UIElementState from './UIElementState';\r\n\r\nexport default class OnMouseHover extends UIElementState\r\n{\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n on_enter(ui_element)\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n\r\n update(ui_element, normalized_mouse_position)\r\n {\r\n if (ui_element.is_mouse_over(normalized_mouse_position))\r\n {\r\n this.__trigger_on_hover(ui_element);\r\n }\r\n else\r\n {\r\n ui_element.set_state(ui_element._on_exit_state);\r\n }\r\n }\r\n\r\n __trigger_on_hover(ui_element)\r\n {\r\n ui_element.on_mouse_hover();\r\n }\r\n}\r\n","\r\nimport Screen from '../Screen';\r\n\r\nimport UIElementMaterial from '../materials/UIElementMaterial';\r\n\r\nimport ScreenSpacePosition from '../ui/ui_element_position/ScreenSpacePosition';\r\nimport WorldSpacePosition from '../ui/ui_element_position/WorldSpacePosition';\r\n\r\nimport OnIdle from '../ui/ui_element_state/OnIdle';\r\nimport OnMouseEnter from '../ui/ui_element_state/OnMouseEnter';\r\nimport OnMouseExit from '../ui/ui_element_state/OnMouseExit';\r\nimport OnMouseHover from '../ui/ui_element_state/OnMouseHover';\r\n\r\nimport { Mesh } from 'three';\r\nimport { PlaneGeometry } from 'three';\r\nimport { Vector2 } from 'three';\r\nimport { Vector3 } from 'three';\r\nimport { NearestFilter } from 'three';\r\nimport { Box2 } from 'three';\r\n\r\nexport default class UIElement extends Mesh\r\n{\r\n constructor(vert, frag)\r\n {\r\n super(new PlaneGeometry(1, 1), new UIElementMaterial());\r\n\r\n this.is_clickable = false;\r\n\r\n this.position_strategy = new WorldSpacePosition();\r\n this.current_state = new OnIdle();\r\n\r\n this._position = new Vector3();\r\n\r\n this._on_idle_state = new OnIdle();\r\n this._on_enter_state = new OnMouseEnter();\r\n this._on_exit_state = new OnMouseExit();\r\n this._on_hover_state = new OnMouseHover();\r\n\r\n this.on_enter = undefined;\r\n this.on_exit = undefined;\r\n this.on_hover = undefined;\r\n\r\n this.mouse_pos_tmp = new Vector2();\r\n this.cached_NDC_position = new Vector2();\r\n this.screen_pos_tmp = new Vector2();\r\n\r\n this.texture_size = new Vector2(1, 1);\r\n\r\n this.frustumCulled = false;\r\n this.matrixAutoUpdate = false;\r\n this.renderOrder = 0;\r\n\r\n this.size = 1;\r\n this.pixel_offset = new Vector2();\r\n }\r\n\r\n set_render_order(value)\r\n {\r\n this.renderOrder = value;\r\n }\r\n\r\n get pivot_point()\r\n {\r\n return this.material.uniforms._PivotPoint.value;\r\n }\r\n\r\n set_pixel_offset(offset)\r\n {\r\n this.pixel_offset.copy(offset);\r\n this.material.uniforms._PixelOffset.value.copy(offset);\r\n }\r\n\r\n set_state(new_state)\r\n {\r\n this.current_state.on_exit(this);\r\n this.current_state = new_state;\r\n this.current_state.on_enter(this);\r\n }\r\n\r\n get position()\r\n {\r\n return this._position;\r\n }\r\n\r\n set use_depth(boolean)\r\n {\r\n this.material.depthTest = boolean;\r\n }\r\n\r\n get use_depth()\r\n {\r\n return this.material.depthTest;\r\n }\r\n\r\n set depth_offset(value)\r\n {\r\n this.material.uniforms._DepthOffset.value = value;\r\n }\r\n\r\n get depth_offset()\r\n {\r\n return this.material.uniforms._DepthOffset.value;\r\n }\r\n\r\n clear_state()\r\n {\r\n this.visible = false;\r\n }\r\n\r\n set_world_space_coordinate_system()\r\n {\r\n this.position_strategy = new WorldSpacePosition();\r\n }\r\n\r\n set_screen_space_coordinate_system()\r\n {\r\n this.position_strategy = new ScreenSpacePosition();\r\n }\r\n\r\n set_texture(texture)\r\n {\r\n texture.minFilter = NearestFilter;\r\n texture.magFilter = NearestFilter;\r\n texture.needsUpdate = true;\r\n\r\n this.texture_size.set(texture.image.width, texture.image.height);\r\n\r\n this.material.uniforms._MainTex.value = texture;\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n this.visible = true;\r\n }\r\n\r\n update_state(normalized_mouse_pos)\r\n {\r\n this.material.uniforms._ScreenSize.value.set(Screen.width, Screen.height);\r\n this.get_size(this.material.uniforms._TextureSize.value);\r\n\r\n this.cached_NDC_position.copy(this.position_strategy.get_pos_NDC(this.position));\r\n this.material.uniforms._NDC.value.copy(this.position);\r\n this.current_state.update(this, normalized_mouse_pos);\r\n }\r\n\r\n is_mouse_over(normalized_mouse_pos)\r\n {\r\n this.screen_pos_tmp.copy(this.cached_NDC_position);\r\n this.to_screen_position(this.screen_pos_tmp);\r\n this.screen_pos_tmp.x += this.pixel_offset.x;\r\n this.screen_pos_tmp.y += this.pixel_offset.y;\r\n\r\n let rect = new Box2().setFromCenterAndSize(this.screen_pos_tmp, this.get_size());\r\n\r\n this.mouse_pos_tmp.copy(normalized_mouse_pos);\r\n this.to_screen_position(this.mouse_pos_tmp);\r\n\r\n return rect.containsPoint(this.mouse_pos_tmp);\r\n }\r\n\r\n to_screen_position(projected_pos)\r\n {\r\n projected_pos.x = (projected_pos.x * 0.5 + 0.5) * Screen.width + this.pixel_offset.x;\r\n projected_pos.y = (projected_pos.y * 0.5 + 0.5) * Screen.height + this.pixel_offset.y;\r\n }\r\n\r\n get_screen_space_position()\r\n {\r\n let pos = this.cached_NDC_position.clone();\r\n this.to_screen_position(pos);\r\n return pos;\r\n }\r\n\r\n set_screen_space_position(screen_pos)\r\n {\r\n this.position.x = (screen_pos.x / Screen.width) * 2 - 1;\r\n this.position.y = (screen_pos.y / Screen.height) * 2 - 1;\r\n }\r\n\r\n dispose()\r\n {\r\n if (this.material.uniforms._MainTex.value)\r\n {\r\n this.material.uniforms._MainTex.value.dispose();\r\n }\r\n Screen.remove_screen_material(this.material);\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n get_size(vector2)\r\n {\r\n if (vector2)\r\n {\r\n return vector2.copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\r\n }\r\n else\r\n {\r\n return new Vector2().copy(this.texture_size).multiplyScalar(this.size / Screen.dpr);\r\n }\r\n }\r\n\r\n on_mouse_enter()\r\n {}\r\n\r\n on_mouse_exit()\r\n {}\r\n\r\n on_mouse_hover()\r\n {}\r\n}\r\n","import { Mesh } from 'three';\r\n\r\nexport default class UpdatableMaterialMesh extends Mesh\r\n{\r\n constructor(geometry, material)\r\n {\r\n super(geometry, material);\r\n\r\n let self = this;\r\n\r\n this.onBeforeRender = () =>\r\n {\r\n self.material.update();\r\n };\r\n }\r\n}\r\n","import { Vector2, Vector4 } from 'three';\r\n\r\nexport default class TextGlyph\r\n{\r\n constructor(offset, plane_bounds, atlas_bounds)\r\n {\r\n let width = plane_bounds.right - plane_bounds.left;\r\n let height = plane_bounds.top - plane_bounds.bottom;\r\n\r\n this.scale = new Vector2(width, height);\r\n this.position = new Vector2(offset + plane_bounds.left, plane_bounds.bottom);\r\n\r\n this.atlas_bounds = new Vector4(atlas_bounds.left, atlas_bounds.right, atlas_bounds.top, atlas_bounds.bottom);\r\n }\r\n}\r\n","import { Vector3, Quaternion, Matrix4, Color, Box2, Vector2 } from 'three';\r\nimport TextGlyph from './TextGlyph';\r\n\r\nexport default class SDFText\r\n{\r\n constructor(glyph_layout, text = '')\r\n {\r\n this.glyph_layout = glyph_layout;\r\n\r\n this.glyphs = [];\r\n\r\n this.glyph_is_dirty = true;\r\n this.matrix_is_dirty = true;\r\n this.color_is_dirty = true;\r\n\r\n this.position = new Vector3();\r\n this.quaternion = new Quaternion();\r\n this.scale = new Vector3(1, 1, 1);\r\n this.matrix = new Matrix4();\r\n\r\n this.color = new Color('#FFFFFF');\r\n\r\n this.pivot_point = new Vector2();\r\n this.__opacity = 1;\r\n\r\n this.__text = text;\r\n\r\n this.__generate_glyphs(text);\r\n }\r\n\r\n set text(value)\r\n {\r\n this.__text = value;\r\n this.__generate_glyphs(value);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n get text()\r\n {\r\n return this.__text;\r\n }\r\n\r\n update_matrix()\r\n {\r\n this.matrix.compose(this.position, this.quaternion, this.scale);\r\n this.matrix_is_dirty = false;\r\n this.glyph_is_dirty = true;\r\n }\r\n\r\n clear_glyph_dirty()\r\n {\r\n this.glyph_is_dirty = false;\r\n }\r\n\r\n clear_color_dirty()\r\n {\r\n this.color_is_dirty = false;\r\n }\r\n\r\n set_rotation(orientation = 0, tilt = 0) // 0..360, -90..0..90\r\n {\r\n let new_orientation = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), (orientation / 360) * Math.PI * 2);\r\n let new_tilt = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), (-tilt / 360) * Math.PI * 2);\r\n\r\n this.quaternion.copy(new_orientation.multiply(new_tilt));\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_position(pos)\r\n {\r\n this.position.copy(pos);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_size(size)\r\n {\r\n this.scale.set(size, size, size);\r\n this.matrix_is_dirty = true;\r\n }\r\n\r\n set_color(col)\r\n {\r\n this.color.set(col);\r\n this.color_is_dirty = true;\r\n }\r\n\r\n set_pivot(pivot)\r\n {\r\n this.pivot_point.copy(pivot);\r\n this.update_glyphs();\r\n }\r\n\r\n set opacity(op)\r\n {\r\n this.__opacity = op;\r\n this.color_is_dirty = true;\r\n }\r\n\r\n get opacity()\r\n {\r\n return this.__opacity;\r\n }\r\n\r\n update_glyphs()\r\n {\r\n this.__generate_glyphs(this.text);\r\n }\r\n\r\n __generate_glyphs(text)\r\n {\r\n let cursor = 0;\r\n\r\n this.glyphs.length = 0;\r\n\r\n for (let i = 0; i < text.length; i++)\r\n {\r\n let unicode = text.charCodeAt(i);\r\n let glyph = this.glyph_layout.find(element => element.unicode === unicode);\r\n if (glyph)\r\n {\r\n if (glyph.planeBounds)\r\n {\r\n let text_glyph = new TextGlyph(cursor, glyph.planeBounds, glyph.atlasBounds);\r\n this.glyphs.push(text_glyph);\r\n }\r\n cursor += glyph.advance;\r\n }\r\n }\r\n\r\n let box2 = new Box2();\r\n let first_glyph = this.glyphs[0];\r\n box2.setFromCenterAndSize(first_glyph.position.clone().add(new Vector2(first_glyph.scale.x / 2, first_glyph.scale.y / 2)), first_glyph.scale);\r\n\r\n for (let i = 1; i < this.glyphs.length; i++)\r\n {\r\n let g = this.glyphs[i];\r\n let box = new Box2().setFromCenterAndSize(g.position.clone().add(new Vector2(g.scale.x / 2, g.scale.y / 2)), g.scale);\r\n box2.union(box);\r\n }\r\n\r\n let box2_size = new Vector2();\r\n box2.getSize(box2_size);\r\n for (let i = 0; i < this.glyphs.length; i++)\r\n {\r\n this.glyphs[i].position.x -= box2_size.x / 2;\r\n this.glyphs[i].position.y -= box2_size.y / 2;\r\n\r\n this.glyphs[i].position.x += (box2_size.x / 2) * this.pivot_point.x;\r\n this.glyphs[i].position.y += (box2_size.y / 2) * this.pivot_point.y;\r\n }\r\n\r\n this.glyph_is_dirty = true;\r\n }\r\n}\r\n","import BaseShaderMaterial from './BaseShaderMaterial';\r\nimport frag from '../shaders/sdf_text/sdf_text.frag';\r\nimport vert from '../shaders/sdf_text/sdf_text.vert';\r\n\r\nimport { Vector2, DoubleSide, LinearFilter, Math as TMath } from 'three';\r\n\r\nexport default class SDFTextMaterial extends BaseShaderMaterial\r\n{\r\n constructor(texture)\r\n {\r\n super(vert, frag, {\r\n _Texture: { value: texture },\r\n _Boldness: { value: 0.5 },\r\n _AtlasSize: { value: new Vector2(1, 1) }\r\n });\r\n\r\n this.transparent = true;\r\n this.extensions = {\r\n derivatives: true\r\n };\r\n this.depthWrite = false;\r\n this.side = DoubleSide;\r\n texture.minFilter = LinearFilter;\r\n texture.magFilter = LinearFilter;\r\n texture.generateMipMaps = false;\r\n }\r\n\r\n set_atlas_size(size)\r\n {\r\n this.uniforms._AtlasSize.value.copy(size);\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.uniforms._Boldness.value = TMath.lerp(0.5, 0.2, value);\r\n }\r\n}\r\n","import SDFText from './SDFText';\r\nimport SDFTextMaterial from '../../materials/SDFTextMaterial';\r\nimport ArrayUtilities from '../../utilities/ArrayUtilities';\r\n\r\nimport {\r\n PlaneBufferGeometry,\r\n Mesh,\r\n Vector2,\r\n InstancedBufferGeometry,\r\n InstancedBufferAttribute,\r\n Float32BufferAttribute,\r\n DynamicDrawUsage\r\n} from 'three';\r\n\r\nexport default class SDFTextBatch extends Mesh\r\n{\r\n constructor(font_layout, atlas_texture)\r\n {\r\n let max_allocations = 2000;\r\n\r\n let instanced_geometry = new InstancedBufferGeometry();\r\n instanced_geometry.instanceCount = 0;\r\n\r\n let geometry = new PlaneBufferGeometry(1, 1);\r\n geometry.translate(0.5, 0.5, 0);\r\n instanced_geometry.setAttribute('position', new Float32BufferAttribute(geometry.getAttribute('position').array, 3));\r\n instanced_geometry.setAttribute('uv', new Float32BufferAttribute(geometry.getAttribute('uv').array, 2));\r\n instanced_geometry.index = geometry.index;\r\n\r\n let transformsCol0 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n let transformsCol1 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n let transformsCol2 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n let transformsCol3 = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n let glyph_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n let plane_bounds = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n let color = new InstancedBufferAttribute(new Float32Array(max_allocations * 4), 4, false);\r\n\r\n transformsCol0.usage = DynamicDrawUsage;\r\n transformsCol1.usage = DynamicDrawUsage;\r\n transformsCol2.usage = DynamicDrawUsage;\r\n transformsCol3.usage = DynamicDrawUsage;\r\n glyph_bounds.usage = DynamicDrawUsage;\r\n plane_bounds.usage = DynamicDrawUsage;\r\n color.usage = DynamicDrawUsage;\r\n\r\n instanced_geometry.setAttribute('transformsCol0', transformsCol0);\r\n instanced_geometry.setAttribute('transformsCol1', transformsCol1);\r\n instanced_geometry.setAttribute('transformsCol2', transformsCol2);\r\n instanced_geometry.setAttribute('transformsCol3', transformsCol3);\r\n\r\n instanced_geometry.setAttribute('glyph_bounds', glyph_bounds);\r\n instanced_geometry.setAttribute('plane_bounds', plane_bounds);\r\n instanced_geometry.setAttribute('color', color);\r\n\r\n super(instanced_geometry, new SDFTextMaterial(atlas_texture));\r\n\r\n this.text_elements = [];\r\n this.font_layout = font_layout;\r\n\r\n this.material.set_atlas_size(new Vector2(font_layout.atlas.width, font_layout.atlas.height));\r\n\r\n this.frustumCulled = false;\r\n }\r\n\r\n set_boldness(value)\r\n {\r\n this.material.set_boldness(value);\r\n }\r\n\r\n add_text(text_str)\r\n {\r\n let elem = new SDFText(this.font_layout.glyphs, text_str);\r\n this.text_elements.push(elem);\r\n return elem;\r\n }\r\n\r\n remove_text(text_elem)\r\n {\r\n ArrayUtilities.remove_elem(this.text_elements, text_elem);\r\n this.update(true);\r\n }\r\n\r\n update(force_update)\r\n {\r\n let glyph_bounds_atr = this.geometry.getAttribute('glyph_bounds');\r\n let plane_bounds_atr = this.geometry.getAttribute('plane_bounds');\r\n\r\n let transformsCol0 = this.geometry.getAttribute('transformsCol0');\r\n let transformsCol1 = this.geometry.getAttribute('transformsCol1');\r\n let transformsCol2 = this.geometry.getAttribute('transformsCol2');\r\n let transformsCol3 = this.geometry.getAttribute('transformsCol3');\r\n\r\n let color_atr = this.geometry.getAttribute('color');\r\n\r\n let matrix_needs_update = force_update === true;\r\n let glyph_needs_update = force_update === true;\r\n let color_needs_update = force_update === true;\r\n\r\n let glyph_count = 0;\r\n for (let i = 0; i < this.text_elements.length; i++)\r\n {\r\n let text = this.text_elements[i];\r\n\r\n if (text.matrix_is_dirty)\r\n {\r\n matrix_needs_update = true;\r\n text.update_matrix();\r\n }\r\n\r\n if (text.glyph_is_dirty)\r\n {\r\n glyph_needs_update = true;\r\n text.clear_glyph_dirty();\r\n }\r\n\r\n if (text.color_is_dirty)\r\n {\r\n color_needs_update = true;\r\n text.clear_color_dirty();\r\n }\r\n\r\n let matrix = text.matrix;\r\n let color = text.color;\r\n let opacity = text.opacity;\r\n\r\n for (let glyph_i = 0; glyph_i < text.glyphs.length; glyph_i++)\r\n {\r\n let glyph = text.glyphs[glyph_i];\r\n\r\n let buffer_i = glyph_count;\r\n\r\n glyph_bounds_atr.setXYZW(buffer_i, glyph.atlas_bounds.x, glyph.atlas_bounds.y, glyph.atlas_bounds.z, glyph.atlas_bounds.w);\r\n plane_bounds_atr.setXYZW(buffer_i, glyph.position.x, glyph.position.y, glyph.scale.x, glyph.scale.y);\r\n\r\n transformsCol0.setXYZW(buffer_i, matrix.elements[0],\r\n matrix.elements[1],\r\n matrix.elements[2],\r\n matrix.elements[3]);\r\n\r\n transformsCol1.setXYZW(buffer_i, matrix.elements[4],\r\n matrix.elements[5],\r\n matrix.elements[6],\r\n matrix.elements[7]);\r\n\r\n transformsCol2.setXYZW(buffer_i, matrix.elements[8],\r\n matrix.elements[9],\r\n matrix.elements[10],\r\n matrix.elements[11]);\r\n\r\n transformsCol3.setXYZW(buffer_i, matrix.elements[12],\r\n matrix.elements[13],\r\n matrix.elements[14],\r\n matrix.elements[15]);\r\n\r\n color_atr.setXYZW(buffer_i, color.r, color.g, color.b, opacity);\r\n\r\n glyph_count++;\r\n }\r\n }\r\n\r\n this.geometry.instanceCount = glyph_count;\r\n\r\n if (glyph_count > this.max_allocations)\r\n {\r\n console.error('SDFTextBatch exceeded maximum glyph allocations(max/current): ', this.max_allocations, glyph_count, this);\r\n }\r\n\r\n if (matrix_needs_update)\r\n {\r\n transformsCol0.needsUpdate = true;\r\n transformsCol1.needsUpdate = true;\r\n transformsCol2.needsUpdate = true;\r\n transformsCol3.needsUpdate = true;\r\n }\r\n if (glyph_needs_update)\r\n {\r\n glyph_bounds_atr.needsUpdate = true;\r\n plane_bounds_atr.needsUpdate = true;\r\n }\r\n if (color_needs_update)\r\n {\r\n color_atr.needsUpdate = true;\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n}\r\n","export default class ActionEvent\r\n{\r\n constructor()\r\n {\r\n\r\n }\r\n\r\n trigger(context)\r\n {\r\n\r\n }\r\n}\r\n","import ActionInterpolator from './ActionInterpolator';\r\n\r\nexport default class VectorInterpolator extends ActionInterpolator\r\n{\r\n constructor(attribute_name, from = 0, to = 1, easing_function = 'linear')\r\n {\r\n super(easing_function);\r\n\r\n this.attribute_name = attribute_name;\r\n this.from = from;\r\n this.to = to;\r\n }\r\n\r\n update(context, t)\r\n {\r\n let tmp = this.from.clone();\r\n tmp.lerp(this.to, this.easing_function(t));\r\n context[this.attribute_name].copy(tmp);\r\n }\r\n}\r\n","import BlitMaterial from '../materials/BlitMaterial';\r\nimport frag from '../shaders/median_filter/median_filter.frag';\r\n\r\nimport { Vector2 } from 'three';\r\n\r\nexport default class MedianFilterMaterial extends BlitMaterial\r\n{\r\n constructor()\r\n {\r\n super(frag, undefined, {\r\n kernel3x3: true\r\n });\r\n\r\n this.uniforms._SourceTex = { value: undefined };\r\n this.uniforms._SourceTexSize = { value: new Vector2(1, 1) };\r\n }\r\n\r\n set_texture(tex)\r\n {\r\n this.uniforms._SourceTex.value = tex;\r\n\r\n let size = this.get_size(tex);\r\n this.uniforms._SourceTexSize.value.copy(size);\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n","import MedianFilterMaterial from '../materials/MedianFilterMaterial';\r\nimport Graphics from '../Graphics';\r\n\r\nimport { WebGLRenderTarget, Vector2, RGBAFormat, FloatType, NearestFilter } from 'three';\r\n\r\nexport default class MedianFilter\r\n{\r\n constructor(renderer)\r\n {\r\n this.RT = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n this.RT1 = new WebGLRenderTarget(1, 1, {\r\n type: FloatType,\r\n format: RGBAFormat,\r\n minFilter: NearestFilter,\r\n magFilter: NearestFilter\r\n });\r\n\r\n this.median_filter_mat = new MedianFilterMaterial();\r\n }\r\n\r\n filter(texture)\r\n {\r\n let tex_size = this.get_size(texture);\r\n if (tex_size.x !== this.RT.width || tex_size.y !== this.RT.height)\r\n {\r\n this.RT.setSize(tex_size.x, tex_size.y);\r\n this.RT1.setSize(tex_size.x, tex_size.y);\r\n }\r\n\r\n this.median_filter_mat.set_texture(texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n\r\n for (let i = 0; i < 0; i++)\r\n {\r\n this.median_filter_mat.set_texture(this.RT.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT1);\r\n\r\n this.median_filter_mat.set_texture(this.RT1.texture);\r\n Graphics.material_pass(this.median_filter_mat, this.RT);\r\n }\r\n\r\n return this.RT;\r\n }\r\n\r\n get_size(tex)\r\n {\r\n if (tex.isVideoTexture)\r\n {\r\n return new Vector2(Math.max(1, tex.image.videoWidth), Math.max(1, tex.image.videoHeight));\r\n }\r\n if (tex.isWebGLRenderTarget)\r\n {\r\n return new Vector2(tex.width, tex.height);\r\n }\r\n if (tex.isTexture)\r\n {\r\n return new Vector2(tex.image.width, tex.image.height);\r\n }\r\n return new Vector2(1, 1);\r\n }\r\n}\r\n","import { Object3D } from 'three';\r\nimport { BufferAttribute } from 'three';\r\nimport { Points } from 'three';\r\n\r\nexport default class GPUParticleSystem extends Object3D\r\n{\r\n constructor()\r\n {\r\n super();\r\n this.attributes = [];\r\n\r\n this.particles = undefined;\r\n }\r\n\r\n set_from_geometry(geometry, material, init_attribute_uvs)\r\n {\r\n // let position = new ParticlePositionAttribute(\"_Position\");\r\n if (init_attribute_uvs && geometry.getAttribute('storage_uv') === undefined)\r\n {\r\n let uv_storage_attr = this.build_uv_storage_attribute(geometry.getAttribute('position').count);\r\n geometry.setAttribute('storage_uv', uv_storage_attr);\r\n }\r\n // position.init_from_geometry(geometry);\r\n // this.attributes.push(position);\r\n\r\n // material.uniforms._Position.value = position.read.texture;\r\n\r\n let points = new Points(geometry, material);\r\n points.frustumCulled = false;\r\n this.particles = points;\r\n\r\n this.add(points);\r\n }\r\n\r\n add_texture_attribute(buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n add_attribute(name, buffer_attribute)\r\n {\r\n\r\n }\r\n\r\n build_uv_storage_attribute(particle_count)\r\n {\r\n let resolution = this.calculate_resolution(particle_count);\r\n let uvs = new Float32Array(particle_count * 2);\r\n for (let i = 0, j = 0; i < particle_count * 2; i += 2, j++)\r\n {\r\n uvs[i] = ((j % resolution) / resolution) + (0.5 / resolution);\r\n uvs[i + 1] = (Math.floor(j / resolution) / resolution) + (0.5 / resolution);\r\n }\r\n\r\n return new BufferAttribute(uvs, 2);\r\n }\r\n\r\n calculate_resolution(particle_count)\r\n {\r\n return Math.ceil(Math.sqrt(particle_count));\r\n }\r\n\r\n update()\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n this.attributes[i].update();\r\n }\r\n }\r\n\r\n set_attribute_update_material(attribute_name, mat)\r\n {\r\n for (let i = 0; i < this.attributes.length; i++)\r\n {\r\n if (this.attributes[i].name === attribute_name)\r\n {\r\n this.attributes[i].update_material = mat;\r\n }\r\n }\r\n }\r\n\r\n dispose()\r\n {\r\n this.particles.geometry.dispose();\r\n this.particles.material.dispose();\r\n }\r\n}\r\n","import BlitMaterial from './BlitMaterial';\r\nimport downsample_frag from '../shaders/dual_filter_blur/downsample.frag';\r\nimport upsample_frag from '../shaders/dual_filter_blur/upsample.frag';\r\n\r\nexport default class DualFilteringBlurMaterial extends BlitMaterial\r\n{\r\n constructor(upsample)\r\n {\r\n super(upsample ? upsample_frag : downsample_frag);\r\n }\r\n}\r\n"],"names":["[object Object]","this","operating_systems","ANDROID","IOS","LINUX","MAC","WINDOWS","userAgent","window","navigator","platform","os","indexOf","test","is_android","get_os","is_ios","match","is_ipad","is_safari","ua","toLowerCase","maxTouchPoints","is_mobile","is_linux","is_mac","is_windows","Validation","n","Number","is_int","is_float","str","JSON","parse","e","AbstractLoader","resource_id","url","size","loaded_bytes","total_bytes","has_finished","has_error","error_message","loaded","total","is_number","console","warn","message","error","resource_container","cache","OS","fetch","method","mode","credentials","redirect","then","on_progress","bind","catch","__on_error","response","reader","body","getReader","contentLength","headers","get","receivedLength","done","value","read","length","__update_downloaded_bytes","on_preloaded_finished","data","ActionSequencer","context","elapsed_time","playing","action_events","initial_context","stringify","tmp_t","channels","channel_names","Object","keys","i","duration","get_duration","__play_clips","delta_time","TMath","clamp","trigger_time","action","push","from","to","interpolator","use_dynamic_from_value","keyframes","attribute_name","undefined","keyframe","Math","max","name","__get_nearest_keyframe","evaluate","trigger","evaluate_keyframe","time","__linear_map_01","from_range_start_value","from_range_end_value","channel_name","closest","min_time","difference","min","abs","x","cos","sin","pow","sqrt","c4","PI","ease_out_bounce","n1","d1","t","sign","ActionInterpolator","easing_function","EasingFunctions","NumberInterpolator","super","lerp","ActionSequencerBuilder","initial_state_data","tracks","current_context","initial_tracks","state_to_tracks","find","element","sequencer","to_value","add_action_interpolator","from_time","to_time","state","queue","zoom_changed_evt","store_clickd_evt","point_selected_evt","config_changed","path_substep_completed","path_completed","go_to_store_requested_evt","resource_loaded_evt","service_clicked_evt","unit_pos_updated_evt","floor_changed_evt","on_enter_floor_navigation","on_exit_floor_navigation","on_enter_floor_selection","on_exit_floor_selection","on_enter_outside_navigation","on_exit_outside_navigation","step_selected_evt","event","payload","callback","zoom","fire","store_id","hit_data","step_number","step_index","resource","service","unit_data","floor_id","resources","EventManager","fire_resource_loaded","DrawIOAnimationSheet","xml_document","animation_nodes","DOMParser","parseFromString","querySelectorAll","animation_tracks","node","x_pos","getAttribute","parseFloat","parent_node","parentElement","includes","split_data","split","value_data","sort","a","b","TransitionTable","transitions","to_state","from_animation_sheet","___time","Clock","__delta_time","__elapsed_time","__allocated_time","Vector2","shader_time","y","getDelta","getElapsedTime","ViewState","global_view_data","transition_progress","action_sequencer","update_transition","ViewStateTransitionHandler","transition_table","last_state","current_state","current_state_data","transitioning","skip","before_exit","show","before_enter","play","update","Time","update_exit_transition","get_progress","update_enter_transition","is_finished","hide","on_exit","on_enter","assign","views","transition_handler","view_name","change_url","v","get_view_by_name","go_to_state","__change_browser_url","view","add_transitions","set_transitions","set_state","set_initial_state_data","history","pushState","ApplicationView","container","ResourceContainer","ViewManager","register_view","classList","add","remove","opacity","style","BaseApplication","BaseRender","renderer","BaseShaderMaterial","ShaderMaterial","vert","frag","uniforms","vertexShader","basic_vert","fragmentShader","basic_frag","_Color","Color","BasisLoader","loader","setWorkerLimit","setTranscoderPath","detectSupport","ctx","load","basis","encoding","sRGBEncoding","set_resource","__loading_ended","xhr","msg","__set_error","BlitMaterial","frag_shader","vert_shader","defines","_MainTex","_Resolution","_TargetResolution","depthWrite","blending","NoBlending","depthTest","depthFunc","AlwaysDepth","_current","current","camera","max_anisotropy","vertex_texture_sampler_available","fp_textures_available","CanvasDrawer","uses_dynamic_font","__textHeight","canvas","document","createElement","getContext","fontStyle","getElementsByTagName","dummy","dummyText","createTextNode","appendChild","setAttribute","offsetHeight","removeChild","text","font","ceil","measureText","width","getFontHeight","ctxOptions","font_color","__draw","draw_canvas","canvas_texture","CanvasTexture","UVMapping","ClampToEdgeWrapping","NearestFilter","generateMipMaps","needsUpdate","height","radius","fill","stroke","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","parameters","dpr","app","json","Idle","is_animating","Animating","easing_function_t","animator","set_property_value","set_current_state","finished_callback","CSSAnimator","css_property","value_prefix","value_suffix","ease_in_out_cubic","AxisHelper","Object3D","scale","blue_points","Vector3","blue_axis_mat","LineBasicMaterial","color","blue_axis_geo","BufferGeometry","setFromPoints","blue_axis_line","Line","renderOrder","green_points","green_axis_mat","green_axis_geo","green_axis_line","red_points","red_axis_mat","red_axis_geo","red_axis_line","set","Scene","scene","traverse","child","geometry","dispose","material","children","Cube","Mesh","segments","BoxGeometry","z","MeshBasicMaterial","Sphere","SphereBufferGeometry","Arrow","dir","cylinder_height","cylinder_geo","CylinderBufferGeometry","translate","cone_geometry","ConeBufferGeometry","cone_height","buffer_geometry","BufferGeometryUtils","mergeBufferGeometries","rotateX","quaternion","setFromUnitVectors","_dir","position","render_width","render_height","width_height","pixel_size","vector2","multiplyScalar","aspect_ratio","ScreenSpaceTextureMaterial","w","h","_ScreenSpacePosition","_ScreenSize","_TextureSize","tex","image","Vector3_one","Vector3_zero","canvas_renderer","display_texture_meshes","origin","arrow","clone","normalize","copy","SceneManager","axis","RT","rt_debug","position_2d","fillStyle","fillRect","clearRect","strokeStyle","points","line","frustumCulled","pos","cube","depth","distanceTo","center","sub","forward_dir","PlaneBufferGeometry","Vector4","basic_color_vert","basic_color_frag","transparent","plane","box","Box3","setFromCenterAndSize","helper","Box3Helper","sphere","input_points","open","catmull","CatmullRomCurve3","updateArcLengths","getSpacedPoints","draw_line","SphereGeometry","sphere_mesh","sphere1","bb","curve","options","offset","mesh","set_texture","set_screen_size","Screen","ClearDepthNormalMaterial","clear_depth","clear_normal","_DepthNormal","DepthNormalMaterial","_FarPlane","far_plane","DepthAndNormalsRenderer","WebGLRenderTarget","clear_depth_normal_mat","depth_normal_material","graphics","__resize_RT_if_necessary","clear","blit_clear_with_material","CameraManager","far","render","setSize","render_target","Blitter","_blit_scene","_blit_material","_blit_quad","_blit_camera","OrthographicCamera","src","dst","src_texture","isWebGLRenderTarget","texture","src_width","src_height","getSize","__render","mat","dst_RT","current_rt","getRenderTarget","setRenderTarget","context_attributes","log","_renderer","blitter","no_render","current_render_mode","generateDepthNormalTexture","depth_and_normals_renderer","is_webgl2","canvas_context","alpha","desynchronized","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","logarithmicDepthBuffer","force_webgl2","constructor","WebGLRenderer","autoClear","setPixelRatio","Configuration","extensions","domElement","Capabilities","capabilities","getMaxAnisotropy","maxVertexTextures","floatVertexTextures","dom_element","depth_normals_RT","new_state","check_for_resize","__update_current_camera","aspect","updateProjectionMatrix","updateMatrix","updateMatrixWorld","override_mat","__apply_override_material","overrideMaterial","buffer","readRenderTargetPixels","clear_stencil","setClearColor","clear_color","clear_alpha","current_width","clientWidth","current_height","clientHeight","canvas_rect","getBoundingClientRect","update_position","update_size","setViewport","material_pass","src_RT","blit_with_material","blit","blob_callback","old_width","old_height","new_width","new_height","tile_width","tile_height","divisions_x","parseInt","divisions_y","ctx_2D","setViewOffset","drawImage","toBlob","clearViewOffset","blob","link","download","href","URL","createObjectURL","click","onclick","requestAnimationFrame","revokeObjectURL","removeAttribute","NormalMaterial","DebugNormalsRender","Graphics","InputController","left_mouse_button_clicked","captured_NDC","target_geometry","target_position","GeometryBatch","batch_width","data_textures","object_names","zero_offset","write_offset","uniform_dirty_count","tmp_uploaded_data_count","uniform_name","default_value_v3","src_tex","__create_rgb_texture","dst_tex","one_pixel_tex","new_data_tex","__add_data_texture","__flood_data_texture_rgb","default_value_v4","__create_rgba_texture","__flood_data_texture_rgba","__create_rgba_float_texture","object_name","vector3","use_r","use_g","use_b","obj_index","__get_object_index","data_texture","__get_data_texture","__set_pixel_rgb","one_pixel","last_accessed_index","dirty_count","vector4","use_a","__set_pixel_rgba","upload_budget","__partial_texture_data_upload","__full_texture_data_upload","texture_data","copyTextureToTexture","index","floor","v3","v4","Uint8Array","DataTexture","RGBFormat","RGBAFormat","Float32Array","FloatType","dst_texture","one_pixel_text","batches","buffer_geometries","attr_accessor_uvs","texture_width","ceilPowerOfTwo","__init_uv_array","uv_index","vertex_count","count","buffer_attribute","BufferAttribute","upload_texture_data","uvs","ui_elements","_tmp_normalized_pos","ss_scene","autoUpdate","ws_scene","ss_camera","elem","splice","set_screen_space_coordinate_system","set_world_space_coordinate_system","Input","NDC","update_state","current_clicked_element","MathUtilities","to_range_start_value","to_range_end_value","number","divisor","rgb","r","round","toString","g","projected_point","points_on_plane","projectPoint","target","elements","x1","x2","arr","col","random","tmp_mat","Matrix4","tmp_vec","tmp_vec2","Plane","ray","Ray","tmp_size","tmp_unproj","applyQuaternion","v_fov","fov","h_fov","atan","tan","distV","distH","plane_position","plane_normal","setFromNormalAndCoplanarPoint","get_forward_dir","isPerspectiveCamera","unproject_mouse_position","unproject","intersectPlane","zoom_scale","world_space_center","camera_forward","project_points_on_plane","projected_points_center","getCenter","up","right","cross","inverse_mat","getInverse","applyMatrix4","projected_center","get_zoom_to_fit_rect","isOrthographicCamera","obj_x","obj_y","object_aspect","object","getWorldPosition","project","left","top","bottom","app_container","init","CameraUtilities","GeometryBatcher","ReflectionPlaneContext","UI","Debug","render_loop","JSONLoader","THREEFileLoader","SSAOMaterial","_InverseProjMatrix","_ProjectionMatrix","_Bias","_Radius","_SampleKernel","__get_sample_kernel","_RandomRotation","__get_rotation_kernel","sample_kernel","rotation_kernel","rotation_texture","wrapS","RepeatWrapping","wrapT","SSAOComposeMaterial","_AO","DisplayNormalTextureMaterial","depth_normals_vert","BoxBlurMaterial","_SampleDir","Blurrer","RT1","RT2","box_blur_mat","NormalAORender","ssao_mat","ssao_compose_mat","debug_normals","ssaa","use_ssaa","main_RT","SSAO_RT","blurrer","__check_RT_size","__update_uniforms","blur","projectionMatrix","NormalRender","UnrealBloomComposeMaterial","nMips","NUM_MIPS","_BlurredTex","_BloomStrength","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","bloomStrength","bloomFactors","bloomRadius","bloomTintColors","rt","col_string","AddMaterial","_SecondTex","GaussianBlurMaterial","kernel_radius","KERNEL_RADIUS","SIGMA","texSize","direction","LuminosityHighPassMaterial","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","GaussianBlurrer","separableBlurMaterials","renderTargetsHorizontal","renderTargetsVertical","kernelSizeArray","rt_pars","minFilter","LinearFilter","magFilter","format","renderTargetBright","generateMipmaps","init_materials","init_RT","luminosity_high_pass_mat","use_luminosity_high_pass","resize_RT","inputRenderTarget","set_direction","dispose_RT","hor","ver","texture_height","set_size","dispose_materials","UnrealBloomRender","bloom_compose_mat","blur_RT","add_mat","set_RT_0","set_RT_1","set_RT_2","set_RT_3","set_RT_4","set_bloom_strength","set_bloom_radius","set_add_texture","val","set_tint_color_0","set_tint_color_1","set_tint_color_2","set_tint_color_3","set_tint_color_4","THREEOrthographicCamera","near","PerspectiveCamera","THREEPerspectiveCamera","HorizontalPlane","VerticalPlane","components","component","component_name","RenderLoop","target_application","_frame_id","is_running","frames_passed","__update","on_post_start","ViewComponentManager","on_pre_render","on_post_render","cancelAnimationFrame","stop","TextureLoader","THREETextureLoader","GLTFLoader","THREEGLTFLoader","gltf","DAELoader","THREEColladaLoader","ColladaLoader","TextLoader","CubemapLoader","THREECubeTextureLoader","setPath","urls","AudioClip","loop","volume","audio","audio_listener","THREEAudio","setBuffer","setLoop","setVolume","pause","is_playing","isPlaying","AudioLoader","THREEAudioLoader","OBJLoader","THREEOBJLoader","FontLoader","TFontLoader","RGBETextureLoader","THREERGBELoader","RGBELoader","setDataType","THREEUnsignedByteType","hdr","PointArrayLoader","parse_path","raw_data","string_array","pop","positions","THREEVector3","HDRCubeTextureLoader","THREEHDRCubeTextureLoader","url_suffix","UnsignedByteType","GLTFDRACOLoader","draco_loader","THREEDRACOLoader","DRACOLoader","setDecoderPath","draco_decoder_path","setDecoderConfig","type","setDRACOLoader","FileLoader","ResourceBatch","batch_name","resource_loaders","loading_finished","finished","has_errors","print_error","get_loaded_bytes","get_total_bytes","SimpleTextDrawer","text_margin","text_size","get_text_size","globalAlpha","textBaseline","textAlign","fillText","ViewComponent","register_component","ArrayUtilities","source","apply","array","items_left_count","closest_point","closest_distance","obj","ids","FrustumPointFitter","camera_quaternion","vertical_fov","degToRad","up_plane_normal","get_up_plane_normal","down_plane_normal","get_down_plane_normal","left_plane_normal","get_left_plane_normal","right_plane_normal","get_right_plane_normal","camera_forward_dir","sphere_center","pull_back_distance","get_distance_to_fit_rect","far_pos","up_plane","down_plane","left_plane","right_plane","apply_center_correction_to_pos","Infinity","inverse_dir","Line3","up_line_intersection","down_line_intersection","left_line_intersection","right_line_intersection","intersectLine","new_up_distance","new_down_distance","new_left_distance","new_right_distance","vertical_min","horizontal_min","forward_correction","target_pos","vertical_offset","get_vertical_correction","horizontal_offset","get_hozirontal_correction","closest_up_point","closest_down_point","closest_distance_to_up_plane","closest_distance_to_down_plane","up_dir","down_line","up_line","down_dist","up_dist","correction","closest_right_point","closest_left_point","closest_distance_to_right_plane","closest_distance_to_left_plane","right_dir","left_line","right_line","left_dist","right_dist","Quaternion","setFromAxisAngle","GeometryUtilities","geometry_buffer","indices","vertices","getX","getY","getZ","add_barycentric_attribute","non_indexed_geometry_buffer","bar_coordinates","ImageUtilities","getImageData","imagedata","sample_count","face_areas","min_area","faces","area","get_face_area","normalized_faces_array","get_uniform_face_distribution","selected_faces","select_random_faces","sample_data_from_faces","sampled_points","sampled_normals","face","w1","w2","sample_point_in_face","c","normal","normals","amount","selected_face","minimum_area","extended_triangle_indices","repetitions_needed","j","v1","v2","vec1","vec2","w3","result_callback","fromGeometry","geometries","get_mesh","animations","skinnedMeshes","isSkinnedMesh","cloneBones","cloneSkinnedMeshes","isBone","skeleton","cloneSkinnedMesh","orderedCloneBones","bones","cloneBone","Skeleton","boneInverses","matrixWorld","cast","receive","castShadow","receiveShadow","object_type","ObjectUtilities","xml","nodeType","attributes","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","xml_to_json","old","TimeUtilities","time_str","hours","minutes","seconds","PerspectiveFrustumPointFitter","get_horizontal_correction","OrthographicFrustumPointFitter","inverse_camera_quat","inverse","inverted_points","distance","distance_to_center","Grid","derivatives","plane_geometry","convert_to_non_indexed_geometry","rotation","_Thickness","_Length","_ElapsedTime","setup","next_position","previous_position","orientation","coverage","accumulated_length","next_point","__get_next_position","previous_point","__get_previous_position","vertexList","nextPositionList","previousPositionList","orientationList","coverageList","setIndex","_length","thickness","parent","WorldImage","pivot","_ScreenAligned","_Scale","_Opacity","DoubleSide","PlaneGeometry","current_scale","computeBoundingBox","tmp_bb_size","boundingBox","img","screen_aligned","boolean","Text2D","is_static","simple_text_drawer","draw_settings","draw_on_texture","LinearMipMapLinearFilter","update_texture","UIElementMaterial","intensity","_PixelOffset","_NDC","_PivotPoint","_DepthOffset","ScreenSpacePosition","WorldSpacePosition","tmp_vec3","UIElementState","ui_element","normalized_mouse_position","OnIdle","is_mouse_over","_on_enter_state","OnMouseEnter","on_mouse_enter","_on_hover_state","_on_exit_state","OnMouseExit","on_mouse_exit","_on_idle_state","OnMouseHover","__trigger_on_hover","on_mouse_hover","UIElement","is_clickable","position_strategy","_position","on_hover","mouse_pos_tmp","cached_NDC_position","screen_pos_tmp","texture_size","matrixAutoUpdate","pixel_offset","pivot_point","use_depth","depth_offset","visible","get_size","normalized_mouse_pos","get_pos_NDC","to_screen_position","rect","Box2","containsPoint","projected_pos","screen_pos","remove_screen_material","UpdatableMaterialMesh","self","onBeforeRender","TextGlyph","plane_bounds","atlas_bounds","SDFText","glyph_layout","glyphs","glyph_is_dirty","matrix_is_dirty","color_is_dirty","matrix","__opacity","__text","__generate_glyphs","compose","tilt","new_orientation","new_tilt","multiply","update_glyphs","op","cursor","unicode","charCodeAt","glyph","planeBounds","text_glyph","atlasBounds","advance","box2","first_glyph","union","box2_size","SDFTextMaterial","_Texture","_Boldness","_AtlasSize","SDFTextBatch","font_layout","atlas_texture","instanced_geometry","InstancedBufferGeometry","instanceCount","Float32BufferAttribute","transformsCol0","InstancedBufferAttribute","max_allocations","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","usage","DynamicDrawUsage","text_elements","set_atlas_size","atlas","set_boldness","text_str","text_elem","remove_elem","force_update","glyph_bounds_atr","plane_bounds_atr","color_atr","matrix_needs_update","glyph_needs_update","color_needs_update","glyph_count","update_matrix","clear_glyph_dirty","clear_color_dirty","glyph_i","buffer_i","setXYZW","ActionEvent","VectorInterpolator","tmp","MedianFilterMaterial","kernel3x3","_SourceTex","_SourceTexSize","isVideoTexture","videoWidth","videoHeight","isTexture","MedianFilter","median_filter_mat","tex_size","GPUParticleSystem","particles","init_attribute_uvs","uv_storage_attr","build_uv_storage_attribute","Points","particle_count","resolution","calculate_resolution","update_material","DualFilteringBlurMaterial","upsample"],"mappings":"moDAsGA,OAAe,IArGf,MAEEA,OAEEC,KAAKC,kBAAoB,CACvBC,QAAS,UACTC,IAAK,MACLC,MAAO,QACPC,IAAK,MACLC,QAAS,WAIbP,SAEE,IAAIQ,EAAYC,OAAOC,UAAUF,UAC7BG,EAAWF,OAAOC,UAAUC,SAI5BC,EAAK,KAuBT,OArB0C,IALrB,CAAC,YAAa,WAAY,SAAU,UAKtCC,QAAQF,GAEzBC,EAAKX,KAAKC,kBAAkBI,KAEe,IAP1B,CAAC,SAAU,OAAQ,QAOhBO,QAAQF,GAE5BC,EAAKX,KAAKC,kBAAkBE,KAEmB,IAZ1B,CAAC,QAAS,QAAS,UAAW,SAY3BS,QAAQF,GAEhCC,EAAKX,KAAKC,kBAAkBK,QAErB,UAAUO,KAAKN,GAEtBI,EAAKX,KAAKC,kBAAkBC,SAEpBS,GAAM,QAAQE,KAAKH,KAE3BC,EAAKX,KAAKC,kBAAkBG,OAGvBO,EAGTG,iBAEE,OAAOd,KAAKe,WAAaf,KAAKC,kBAAkBC,QAGlDc,aAEE,OAAOP,UAAUF,UAAUU,MAAM,uBAAyBjB,KAAKkB,QAGjEC,gBAEE,IAAIC,EAAKX,UAAUF,UAAUc,cAE7B,OAA8B,IAA1BD,EAAGR,QAAQ,aAETQ,EAAGR,QAAQ,WAAa,GAahCM,cAEE,OAAQT,UAAUF,UAAUU,MAAM,QAAUR,UAAUa,gBAAkBb,UAAUa,eAAiB,EAGrGC,gBAEE,QAAUd,UAAUF,UAAUU,MAAM,+GAGtCO,eAEE,OAAOxB,KAAKe,WAAaf,KAAKC,kBAAkBG,MAGlDqB,aAEE,OAAOzB,KAAKe,WAAaf,KAAKC,kBAAkBI,IAGlDqB,iBAEE,OAAO1B,KAAKe,WAAaf,KAAKC,kBAAkBK,UClGrC,MAAMqB,GAEnB5B,eAGAA,cAAc6B,GAEZ,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtC7B,gBAAgB6B,GAEd,OAAOC,OAAOD,KAAOA,GAAKA,EAAI,GAAM,EAGtC7B,iBAAiB6B,GAEf,OAAO5B,KAAK8B,OAAOF,IAAM5B,KAAK+B,SAASH,GAGzC7B,eAAeiC,GAEb,IAEEC,KAAKC,MAAMF,GAEb,MAAOG,GAEL,OAAO,EAGT,OAAO,GC5BI,MAAMC,GAEnBrC,YAAYsC,EAAaC,EAAKC,EAAO,GAEnCvC,KAAKqC,YAAcA,EACnBrC,KAAKsC,IAAMA,EACXtC,KAAKwC,aAAe,EACpBxC,KAAKyC,YAAcF,EAEnBvC,KAAK0C,cAAe,EACpB1C,KAAK2C,WAAY,EACjB3C,KAAK4C,cAAgB,OAGvB7C,0BAA0B8C,EAAQC,GAEhCD,EAASlB,GAAWoB,UAAUF,GAAUA,EAAS,EACjDC,EAASnB,GAAWoB,UAAUD,GAAUA,EAAS,EAEjD9C,KAAKwC,aAAeK,EAEhBC,EAAQ,IAEV9C,KAAKyC,YAAcK,GAGjB9C,KAAKwC,aAAexC,KAAKyC,aAE3BO,QAAQC,KAAK,8EAA+EjD,KAAKsC,KAIrGvC,kBAEEC,KAAK0C,cAAe,EAGtB3C,YAAYmD,GAEVlD,KAAK2C,WAAY,EACjB3C,KAAK4C,cAAgBM,EAGvBnD,cAEEiD,QAAQG,MAAM,uBAAyBnD,KAAKqC,YAAc,cAAgBrC,KAAKsC,IAAM,SAAWtC,KAAK4C,eAGvG7C,KAAKqD,GAEH,MAAMC,EAAQC,GAAGnC,UAAY,WAAa,UAE1CoC,MAAMvD,KAAKsC,IAAK,CACdkB,OAAQ,MACRC,KAAM,OACNJ,MAAOA,EACPK,YAAa,cACbC,SAAU,WAETC,KAAK5D,KAAK6D,YAAYC,KAAK9D,KAAMoD,IACjCW,MAAM/D,KAAKgE,WAAWF,KAAK9D,OAGhCD,kBAAkBqD,EAAoBa,GAEpC,MAAMC,EAASD,EAASE,KAAKC,YAG7B,IAAIC,GAAiBJ,EAASK,QAAQC,IAAI,kBAGtCC,EAAiB,EAErB,OACA,CACE,MAAMC,KAAEA,EAAIC,MAAEA,SAAgBR,EAAOS,OAErC,GAAIF,EAEF,MAGFD,GAAkBE,EAAME,OAExB5E,KAAK6E,0BAA0BL,EAAgBH,GAIjDrE,KAAK8E,sBAAsB1B,GAG7BrD,sBAAsBqD,IAItBrD,WAAWgF,GAET/B,QAAQG,MAAM4B,ICjGH,MAAMC,GAEnBjF,YAAYkF,GAEVjF,KAAKkF,cAAgB,KAErBlF,KAAKmF,SAAU,EAEfnF,KAAKoF,cAAgB,GACrBpF,KAAKiF,QAAUA,EAEfjF,KAAKqF,gBAAkBpD,KAAKC,MAAMD,KAAKqD,UAAUL,IAEjDjF,KAAKuF,MAAQ,EAEbvF,KAAKwF,SAAW,GAEhB,IAAIC,EAAgBC,OAAOC,KAAKV,GAChC,IAAK,IAAIW,EAAI,EAAGA,EAAIH,EAAcb,OAAQgB,IAExC5F,KAAKwF,SAASC,EAAcG,IAAM,GAGpC5F,KAAK6F,SAAW,EAGlB9F,OAEEC,KAAKmF,SAAU,EAGjBpF,OAEEC,KAAKmF,SAAU,EAGjBpF,QAEEC,KAAKkF,cAAgB,KAGvBnF,OAEEC,KAAKkF,aAAelF,KAAK8F,eACzB9F,KAAK+F,aAAa/F,KAAKkF,aAAclF,KAAKkF,aAAe,KAG3DnF,OAAOiG,GAEDhG,KAAKmF,UAEPnF,KAAKkF,aAAelF,KAAKkF,aAAec,EACxChG,KAAK+F,aAAa/F,KAAKkF,aAAclF,KAAKkF,aAAec,IAI7DjG,eAEE,OAAOkG,EAAMC,MAAMlG,KAAKkF,aAAelF,KAAK8F,eAAgB,EAAG,GAGjE/F,cAEE,OAAOC,KAAKkF,aAAelF,KAAK8F,eAGlC/F,iBAAiBoG,EAAcC,GAE7BpG,KAAKoF,cAAciB,KAAK,CACtBF,aAAcA,EACdC,OAAQA,IAIZrG,wBAAwBuG,EAAMC,EAAIC,EAAcC,GAAyB,GAEvE,GAAIA,EACJ,CACE,IAAIC,EAAY1G,KAAKwF,SAASgB,EAAaG,qBAEzBC,IAAdF,GAEF1D,QAAQG,MAAM,GAAGqD,EAAaG,iDAGP,IAArBD,EAAU9B,OAEZ4B,EAAaF,KAAOtG,KAAKqF,gBAAgBmB,EAAaG,gBAItDH,EAAaF,KAAOI,EAAUA,EAAU9B,OAAS,GAAG4B,aAAaD,GAIrE,IAAIM,EAAW,CACbP,KAAMA,EACNC,GAAIA,EACJC,aAAcA,GAGhBxG,KAAK6F,SAAWiB,KAAKC,IAAI/G,KAAK6F,SAAUU,GACxCvG,KAAKwF,SAASgB,EAAaG,gBAAgBN,KAAKQ,GAGlD9G,0BAA0BiH,GAExB,IAAIH,EAAW7G,KAAKiH,uBAAuBD,EAAMhH,KAAKkF,cAEtD,OAAIlF,KAAKkF,aAAe2B,EAASP,KAExBO,EAASL,aAAaU,SAAS,GAGjCL,EAASL,aAAaU,SAAS,GAGxCnH,eAEE,OAAOC,KAAK6F,SAGd9F,aAAauG,EAAMC,GAEjB,IAAK,IAAIX,EAAI,EAAGA,EAAI5F,KAAKoF,cAAcR,OAAQgB,IAEzC5F,KAAKoF,cAAcQ,GAAGO,cAAgBG,GACtCtG,KAAKoF,cAAcQ,GAAGO,aAAeI,GAGvCvG,KAAKoF,cAAcQ,GAAGQ,OAAOe,QAAQnH,KAAKiF,SAG9C,IAAIQ,EAAgBC,OAAOC,KAAK3F,KAAKqF,iBAErC,IAAK,IAAIO,EAAI,EAAGA,EAAIH,EAAcb,OAAQgB,IAC1C,CACE,IAAIoB,EAAOvB,EAAcG,GACrBiB,EAAW7G,KAAKiH,uBAAuBD,EAAMV,GACjDtG,KAAKiF,QAAQ+B,GAAQhH,KAAKoH,kBAAkBP,EAAUP,IAI1DvG,kBAAkB8G,EAAUQ,GAG1B,OADArH,KAAKuF,MAAQvF,KAAKsH,gBAAgBD,EAAMR,EAASP,KAAMO,EAASN,IACzDM,EAASL,aAAaU,SAASjB,EAAMC,MAAMlG,KAAKuF,MAAO,EAAG,IAGnExF,gBAAgB2E,EACd6C,EACAC,GAEA,OAAS9C,EAAQ6C,IAA2BC,EAAuBD,KAAqC,EAG1GxH,uBAAuB0H,EAAcJ,GAEnC,IAAIK,EACAC,EAAW,QACXjB,EAAY1G,KAAKwF,SAASiC,GAC9B,IAAK,IAAI7B,EAAI,EAAGA,EAAIc,EAAU9B,OAAQgB,IACtC,CACE,IAAIiB,EAAWH,EAAUd,GACrBgC,EAAad,KAAKe,IACpBf,KAAKgB,IAAIjB,EAASP,KAAOe,GACzBP,KAAKgB,IAAIjB,EAASN,GAAKc,IAGrBO,EAAaD,IAEfA,EAAWC,EACXF,EAAUb,GAGd,OAAOa,GCoCX,OAAe,IAtNf,MAEE3H,eAGAA,OAAOgI,GAEL,OAAOA,EAGThI,WAAWgI,GAET,OAAO,EAAIjB,KAAKgB,IAAS,EAAJC,IAAmB,GAG1ChI,aAAagI,GAEX,OAAO,EAAIjB,KAAKkB,IAAQ,UAAJD,EAAgB,GAGtChI,cAAcgI,GAEZ,OAAOjB,KAAKmB,IAAQ,UAAJF,EAAgB,GAGlChI,iBAAiBgI,GAEf,QAASjB,KAAKkB,IAAI,UAAYD,GAAK,GAAK,EAG1ChI,cAAcgI,GAEZ,OAAOA,EAAIA,EAAIA,EAGjBhI,eAAegI,GAEb,OAAO,EAAIjB,KAAKoB,IAAI,EAAIH,EAAG,GAG7BhI,kBAAkBgI,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EACZ,EAAIjB,KAAKoB,KAAK,EAAIH,EAAI,EAAG,GAAK,EAGpChI,aAAagI,GAEX,OAAOA,EAAIA,EAGbhI,cAAcgI,GAEZ,OAAO,GAAK,EAAIA,IAAM,EAAIA,GAG5BhI,iBAAiBgI,GAEf,OAAOA,EAAI,GACP,EAAIA,EAAIA,EACR,EAAIjB,KAAKoB,KAAK,EAAIH,EAAI,EAAG,GAAK,EAGpChI,cAAcgI,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAGrBhI,eAAegI,GAEb,OAAO,EAAIjB,KAAKoB,IAAI,EAAIH,EAAG,GAG7BhI,kBAAkBgI,GAEhB,OAAOA,EAAI,GACP,EAAIA,EAAIA,EAAIA,EAAIA,EAChB,EAAIjB,KAAKoB,KAAK,EAAIH,EAAI,EAAG,GAAK,EAGpChI,cAAcgI,GAEZ,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,EAGzBhI,eAAegI,GAEb,OAAO,EAAIjB,KAAKoB,IAAI,EAAIH,EAAG,GAG7BhI,kBAAkBgI,GAEhB,OAAOA,EAAI,GACP,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EACrB,EAAIjB,KAAKoB,KAAK,EAAIH,EAAI,EAAG,GAAK,EAGpChI,aAAagI,GAEX,OAAa,IAANA,EAAU,EAAIjB,KAAKoB,IAAI,EAAG,GAAKH,EAAI,IAG5ChI,cAAcgI,GAEZ,OAAa,IAANA,EAAU,EAAI,EAAIjB,KAAKoB,IAAI,GAAI,GAAKH,GAG7ChI,iBAAiBgI,GAEf,OAAa,IAANA,EAAU,EAAU,IAANA,EAAU,EAAIA,EAAI,GACnCjB,KAAKoB,IAAI,EAAG,GAAKH,EAAI,IAAM,GAC1B,EAAIjB,KAAKoB,IAAI,GAAI,GAAKH,EAAI,KAAO,EAGxChI,aAAagI,GAEX,OAAO,EAAIjB,KAAKqB,KAAK,EAAIrB,KAAKoB,IAAIH,EAAG,IAGvChI,cAAcgI,GAEZ,OAAOjB,KAAKqB,KAAK,EAAIrB,KAAKoB,IAAIH,EAAI,EAAG,IAGvChI,iBAAiBgI,GAEf,OAAOA,EAAI,IACN,EAAIjB,KAAKqB,KAAK,EAAIrB,KAAKoB,IAAI,EAAIH,EAAG,KAAO,GACzCjB,KAAKqB,KAAK,EAAIrB,KAAKoB,KAAK,EAAIH,EAAI,EAAG,IAAM,GAAK,EAGrDhI,aAAagI,GAEX,OAAO,OAASA,EAAIA,EAAIA,EAAI,OAASA,EAAIA,EAG3ChI,cAAcgI,GAEZ,OAAO,EAAI,OAASjB,KAAKoB,IAAIH,EAAI,EAAG,GAAK,OAASjB,KAAKoB,IAAIH,EAAI,EAAG,GAGpEhI,iBAAiBgI,GAEf,OAAOA,EAAI,GACNjB,KAAKoB,IAAI,EAAIH,EAAG,IAAM,SAAsBA,EAAI,WAAc,GAC9DjB,KAAKoB,IAAI,EAAIH,EAAI,EAAG,IAAM,WAAuB,EAAJA,EAAQ,GAAK,WAAa,GAAK,EAGnFhI,gBAAgBgI,GAEd,MAAMK,EAAM,EAAItB,KAAKuB,GAAM,EAE3B,OAAa,IAANN,EACH,EACM,IAANA,EACE,GACCjB,KAAKoB,IAAI,EAAG,GAAKH,EAAI,IAAMjB,KAAKmB,KAAS,GAAJF,EAAS,OAASK,GAGhErI,iBAAiBgI,GAEf,OAAa,IAANA,EAAU,EAAU,IAANA,EAAU,EAC3BjB,KAAKoB,IAAI,GAAI,GAAKH,GAAKjB,KAAKmB,IAAsB,UAAb,GAAJF,EAAS,MAAqB,EAGrEhI,oBAAoBgI,GAElB,OAAa,IAANA,EAAU,EAAU,IAANA,EAAU,EAAIA,EAAI,IACjCjB,KAAKoB,IAAI,EAAG,GAAKH,EAAI,IAAMjB,KAAKmB,IAAwB,WAAnB,GAAKF,EAAI,SAAwB,EACxEjB,KAAKoB,IAAI,GAAI,GAAKH,EAAI,IAAMjB,KAAKmB,IAAwB,WAAnB,GAAKF,EAAI,SAAuB,EAAI,EAGhFhI,eAAegI,GAEb,OAAO,EAAI/H,KAAKsI,gBAAgB,EAAIP,GAGtChI,gBAAgBgI,GAEd,MAAMQ,EAAK,OACLC,EAAK,KAEX,OAAIT,EAAI,EAAIS,EAEHD,EAAKR,EAAIA,EAETA,EAAI,EAAIS,EAERD,GAAMR,GAAK,IAAMS,GAAMT,EAAI,IAE3BA,EAAI,IAAMS,EAEVD,GAAMR,GAAK,KAAOS,GAAMT,EAAI,MAI5BQ,GAAMR,GAAK,MAAQS,GAAMT,EAAI,QAIxChI,mBAAmBgI,GAEjB,OAAOA,EAAI,IACN,EAAI/H,KAAKsI,gBAAgB,EAAI,EAAIP,IAAM,GACvC,EAAI/H,KAAKsI,gBAAgB,EAAIP,EAAI,IAAM,EAG9ChI,UAAU0I,GAER,OAAO,EAAM3B,KAAKoB,IAAIpB,KAAKgB,IAAIhB,KAAKmB,IAAIQ,EAAI,IAAO,IAAQ3B,KAAK4B,KAAK5B,KAAKmB,IAAIQ,IAAM3B,KAAKmB,IAAIQ,EAAI,IAAM,GAAO,KChNnG,MAAME,GAEnB5I,YAAY6I,EAAkB,UAE5B5I,KAAK4I,qBAAkBhC,EAIrB5G,KAAK4I,gBAFwB,iBAApBA,EAEcC,GAAgBD,GAIhBA,EAI3B7I,OAAOkF,EAASwD,KCfH,MAAMK,WAA2BH,GAE9C5I,YAAY4G,EAAgBL,EAAO,EAAGC,EAAK,EAAGqC,EAAkB,UAE9DG,MAAMH,GAEN5I,KAAK2G,eAAiBA,EACtB3G,KAAKsG,KAAOA,EACZtG,KAAKuG,GAAKA,EAGZxG,OAAOkF,EAASwD,GAEdxD,EAAQjF,KAAK2G,gBAAkBV,EAAM+C,KAAKhJ,KAAKsG,KAAMtG,KAAKuG,GAAIvG,KAAK4I,gBAAgBH,IAGrF1I,SAAS0I,GAEP,OAAOxC,EAAM+C,KAAKhJ,KAAKsG,KAAMtG,KAAKuG,GAAIvG,KAAK4I,gBAAgBH,KClBhD,MAAMQ,GAEnBlJ,YAAYmJ,GAEVlJ,KAAKkJ,mBAAqBA,EAG5BnJ,qBAAqBoJ,EAAQC,GAE3B,IAAIC,EAAiBrJ,KAAKsJ,gBAAgBtJ,KAAKkJ,oBAE/C,IAAK,IAAItD,EAAI,EAAGA,EAAIyD,EAAezE,OAAQgB,SAEmDgB,IAAxFuC,EAAOI,MAAKC,GAAWA,EAAQ7C,iBAAmB0C,EAAezD,GAAGe,kBAEtEwC,EAAO9C,KAAKgD,EAAezD,IAI/B,IAAI6D,EAAY,IAAIzE,GAAgBoE,GAEpC,IAAK,IAAIxD,EAAI,EAAGA,EAAIuD,EAAOvE,OAAQgB,IACnC,CACE,IAAI6C,EAAIU,EAAOvD,GACXY,EAAe,IAAIsC,GAAmBL,EAAE9B,eAAgByC,EAAgBX,EAAE9B,gBAAiB8B,EAAEiB,SAAUjB,EAAEG,iBAC7Ga,EAAUE,wBAAwBlB,EAAEmB,UAAWnB,EAAEoB,QAASrD,GAAc,GAG1E,OAAOiD,EAGT1J,gBAAgB+J,GAEd,IAAIX,EAAS,GAETxD,EAAOD,OAAOC,KAAKmE,GAEvB,IAAK,IAAIlE,EAAI,EAAGA,EAAID,EAAKf,OAAQgB,IAE/BuD,EAAO9C,KAAK,CACVM,eAAgBhB,EAAKC,GACrBgE,UAAW,EACXC,QAAS,EACTH,SAAUI,EAAMnE,EAAKC,IACrBgD,gBAAiB,sBAIrB,OAAOO,GCkGX,OAAe,IArJf,MAEEpJ,OAEEC,KAAK+J,MAAQ,GAEb/J,KAAKgK,iBAA6B,eAClChK,KAAKiK,iBAA6B,gBAClCjK,KAAKkK,mBAA6B,iBAClClK,KAAKmK,eAA6B,iBAElCnK,KAAKoK,uBAA6B,yBAClCpK,KAAKqK,eAA6B,iBAClCrK,KAAKsK,0BAA6B,wBAElCtK,KAAKuK,oBAA6B,kBAClCvK,KAAKwK,oBAA6B,kBAClCxK,KAAKyK,qBAA6B,wBAElCzK,KAAK0K,kBAA6B,gBAElC1K,KAAK2K,0BAA6B,4BAClC3K,KAAK4K,yBAA6B,2BAElC5K,KAAK6K,yBAA6B,2BAClC7K,KAAK8K,wBAA6B,0BAElC9K,KAAK+K,4BAA+B,8BACpC/K,KAAKgL,2BAA+B,6BAEpChL,KAAKiL,kBAAoB,gBAG3BlL,KAAKmL,EAAOC,GAEV,IAAIpB,EAAQ/J,KAAK+J,MAAMmB,GAEvB,QAActE,IAAVmD,EAEF,OAEF,IAAInE,EAAImE,EAAMnF,OACd,KAAOgB,KAELmE,EAAMnE,GAAGuF,GAIbpL,GAAGmL,EAAOE,QAEyB,IAAtBpL,KAAK+J,MAAMmB,KAEpBlL,KAAK+J,MAAMmB,GAAS,IAGtBlL,KAAK+J,MAAMmB,GAAO7E,KAAK+E,GAGzBrL,kBAAkBsL,GAEhBrL,KAAKsL,KAAKtL,KAAKgK,iBAAkBqB,GAGnCtL,oBAAoBwL,GAElBvL,KAAKsL,KAAKtL,KAAKiK,iBAAkBsB,GAGnCxL,oBAAoByL,GAElBxL,KAAKsL,KAAKtL,KAAKkK,mBAAoBsB,GAGrCzL,sBAEEC,KAAKsL,KAAKtL,KAAKmK,gBAGjBpK,4BAA4B0L,GAE1BzL,KAAKsL,KAAKtL,KAAKoK,uBAAwBqB,GAGzC1L,sBAEEC,KAAKsL,KAAKtL,KAAKqK,gBAGjBtK,mBAAmB2L,GAEjB1L,KAAKsL,KAAKtL,KAAKiL,kBAAmBS,GAGpC3L,2BAA2BwL,GAEzBvL,KAAKsL,KAAKtL,KAAKsK,0BAA2BiB,GAG5CxL,qBAAqB4L,GAEnB3L,KAAKsL,KAAKtL,KAAKuK,oBAAqBoB,GAGtC5L,qBAAqB6L,GAEnB5L,KAAKsL,KAAKtL,KAAKwK,oBAAqBoB,GAGtC7L,2BAA2B8L,GAEzB7L,KAAKsL,KAAKtL,KAAKyK,qBAAsBoB,GAGvC9L,oBAAoB+L,GAElB9L,KAAKsL,KAAKtL,KAAK0K,kBAAmBoB,GAGpC/L,+BAA+B+J,GAE7B9J,KAAKsL,KAAKtL,KAAK2K,0BAA2Bb,GAG5C/J,8BAA8B+J,GAE5B9J,KAAKsL,KAAKtL,KAAK4K,yBAA0Bd,GAG3C/J,8BAA8B+J,GAE5B9J,KAAKsL,KAAKtL,KAAK6K,yBAA0Bf,GAG3C/J,6BAA6B+J,GAE3B9J,KAAKsL,KAAKtL,KAAK8K,wBAAyBhB,GAG1C/J,iCAAiC+J,GAE/B9J,KAAKsL,KAAKtL,KAAK+K,4BAA6BjB,GAG9C/J,gCAAgC+J,GAE9B9J,KAAKsL,KAAKtL,KAAKgL,2BAA4BlB,KCvH/C,OAAe,IAxBf,MAEE/J,OAEEC,KAAK+L,UAAY,GAGnBhM,aAAaiH,EAAM2E,GAEjB3L,KAAK+L,UAAU/E,GAAQ2E,EACvBK,GAAaC,qBAAqB,CAAEjF,KAAMA,EAAMtC,MAAOiH,IAGzD5L,aAAaiH,GAEX,OAAOhH,KAAK+L,UAAU/E,GAGxBjH,IAAIiH,GAEF,OAAOhH,KAAK+L,UAAU/E,KCtBX,MAAMkF,GAEnBnM,eAKAA,MAAMoM,GAEJ,IAEIC,GAFM,IAAIC,WAAYC,gBAAgBH,EAAc,YAE9BI,iBAAiB,cAEvCC,EAAmB,GAEvB,IAAK,IAAI5G,EAAI,EAAGA,EAAIwG,EAAgBxH,OAAQgB,IAC5C,CACE,IAAI6G,EAAOL,EAAgBxG,GAEvB8G,EAAQD,EAAKE,aAAa,KAC9BD,EAAkB,OAAVA,EAAiB,EAAIE,WAAWF,GAExC,IAAIpG,EAAOoG,EAAQ,IACfnG,EAAKD,EAAOsG,WAAWH,EAAKE,aAAa,UAAY,IAErDE,EAAcJ,EAAKK,cAEnB/H,EAAO8H,EAAYF,aAAa,SAKpC,GAHoBE,EAAYF,aAAa,SAASI,SAAS,gBACzCF,EAAYF,aAAa,SAASI,SAAS,UAEnC,KAAThI,IAAgBA,EAAKgI,SAAS,KACnD,CACE,IAAIC,EAAajI,EAAKkI,MAAM,KAExBtG,EAAiBqG,EAAW,GAE5BE,EAAaF,EAAW,GAAGC,MAAM,MACjCvD,EAAWkD,WAAWM,EAAW,IACjCtE,EAAkBsE,EAAW,GAEP,IAAtBF,EAAWpI,QAEb5B,QAAQG,MAAM,4BAA6B4B,GAGnB,IAAtBmI,EAAWtI,QAEb5B,QAAQG,MAAM,4BAA6B4B,GAG7CyH,EAAiBnG,KAAK,CACpBM,eAAgBA,EAChBiD,UAAWtD,EACXuD,QAAStD,EACTmD,SAAUA,EACVd,gBAAiBA,KAUvB,OALA4D,EAAiBW,MAAK,CAACC,EAAGC,IAEjBD,EAAExD,UAAYyD,EAAEzD,YAGlB4C,GCjEI,MAAMc,GAEnBvN,cAEEC,KAAKuN,YAAc,GACnBvN,KAAKkJ,mBAAqB,GAG5BnJ,IAAIyN,EAAUpE,GAEZ,IAAK,IAAIxD,EAAI,EAAGA,EAAI5F,KAAKuN,YAAY3I,OAAQgB,IAE3C,GAAI5F,KAAKuN,YAAY3H,GAAGW,KAAOiH,EAC/B,CAGE,OAFuB,IAAIvE,GAAuBjJ,KAAKkJ,oBAAoBuE,qBAAqBzN,KAAKuN,YAAY3H,GAAGb,KAAMqE,GAM9HpG,QAAQG,MAAM,0CAA2CqK,GAI3DzN,gBAAgBwN,GAEd,IAAK,IAAI3H,EAAI,EAAGA,EAAI2H,EAAY3I,OAAQgB,IAEtC5F,KAAKuN,YAAYlH,KAAKkH,EAAY3H,IAItC7F,gBAAgBwN,GAEdvN,KAAKuN,YAAcA,EAGrBxN,uBAAuBmJ,GAErBlJ,KAAKkJ,mBAAqBA,GCJ9B,OAAe,IAlCf,MAEEnJ,OAEEC,KAAK0N,QAAU,IAAIC,EACnB3N,KAAK4N,aAAe,EACpB5N,KAAK6N,eAAiB,EACtB7N,KAAK8N,iBAAmB,IAAIC,EAAQ,EAAG,GAGzC/H,iBAEE,OAAOhG,KAAK4N,aAAe,GAAM5N,KAAK4N,aAAe,KAGvD1I,mBAEE,OAAOlF,KAAK6N,eAGdG,kBAIE,OAFAhO,KAAK8N,iBAAiB/F,EAAI/H,KAAKgG,WAC/BhG,KAAK8N,iBAAiBG,EAAIjO,KAAKkF,aACvBlF,KAAK8N,iBAGf/N,WAEEC,KAAK4N,aAAe5N,KAAK0N,QAAQQ,WACjClO,KAAK6N,eAAiB7N,KAAK0N,QAAQS,mBCjCxB,MAAMC,GAEnBrO,YAAYiH,GAEVhH,KAAKgH,KAAOA,EAGdjH,SAIAA,QAIAA,QAIAA,gBAIAA,YAIAA,UAIAA,wBAAwBsO,EAAkBC,EAAqBC,GAG7DvO,KAAKwO,kBAAkBH,EAAkBC,EAAqBC,GAGhExO,uBAAuBsO,EAAkBC,EAAqBC,IAK9DxO,kBAAkBsO,EAAkBC,EAAqBC,IAIzDxO,eAIAA,YC/Ca,MAAM0O,GAEnB1O,YAAY2O,GAEV1O,KAAK2O,WAAa,IAAIP,GACtBpO,KAAK4O,cAAgB,IAAIR,GAEzBpO,KAAKkJ,mBAAqB,GAC1BlJ,KAAK6O,mBAAqB,GAE1B7O,KAAK0O,iBAAmBA,EAExB1O,KAAK8O,eAAgB,EAGvB/O,YAAY+J,EAAOiF,GAAO,GAExB/O,KAAK2O,WAAa3O,KAAK4O,cACvB5O,KAAK4O,cAAgB9E,EAErB9J,KAAK2O,WAAWK,cAChBhP,KAAK4O,cAAcK,OACnBjP,KAAK4O,cAAcM,eAEnBlP,KAAKuO,iBAAmBvO,KAAK0O,iBAAiBnK,IAAIvE,KAAK4O,cAAc5H,KAAMhH,KAAK6O,oBAChF7O,KAAKuO,iBAAiBY,OAEtBnP,KAAK8O,eAAgB,EAEjBC,IAEF/O,KAAKuO,iBAAiBQ,OACtB/O,KAAKoP,UAITrP,SAEMC,KAAK8O,eAEP9O,KAAKuO,iBAAiBa,OAAOC,GAAKrJ,YAClChG,KAAK2O,WAAWW,uBAAuBtP,KAAK6O,mBAAoB7O,KAAKuO,iBAAiBgB,eAAgBvP,KAAKuO,kBAC3GvO,KAAK4O,cAAcY,wBAAwBxP,KAAK6O,mBAAoB7O,KAAKuO,iBAAiBgB,eAAgBvP,KAAKuO,kBAE3GvO,KAAKuO,iBAAiBkB,gBAExBzP,KAAK8O,eAAgB,EAEjB9O,KAAK2O,WAAW3H,OAAShH,KAAK4O,cAAc5H,MAE9ChH,KAAK2O,WAAWe,OAGlB1P,KAAK2O,WAAWgB,UAChB3P,KAAK4O,cAAcgB,aAKrB5P,KAAK4O,cAAcQ,SAIvBrP,UAAU+J,GAER9J,KAAK4O,cAAgB9E,EAGvB/J,uBAAuBmJ,GAErBxD,OAAOmK,OAAO7P,KAAKkJ,mBAAoBA,GACvCxD,OAAOmK,OAAO7P,KAAK6O,mBAAoB3F,ICgC3C,OAAe,IAvGf,MAEEnJ,cAEEC,KAAK8P,MAAQ,GAEb9P,KAAK0O,iBAAmB,IAAIpB,GAC5BtN,KAAK+P,mBAAqB,IAAItB,GAA2BzO,KAAK0O,kBAGhE3O,SAEEC,KAAK+P,mBAAmBX,SAG1BrP,WAAWiQ,EAAWC,GAAa,EAAMlB,GAAO,GAE9C,IAAImB,EAAIlQ,KAAKmQ,iBAAiBH,GAC9BhQ,KAAK+P,mBAAmBK,YAAYF,EAAGnB,GAEnCkB,GAEFjQ,KAAKqQ,qBAAqBH,EAAE5N,KAIhCvC,cAAcuQ,GAEZtQ,KAAK8P,MAAMzJ,KAAKiK,GAGlBvQ,SAASiQ,GAEP,IAAK,IAAIpK,EAAI,EAAGA,EAAI5F,KAAK8P,MAAMlL,OAAQgB,IAErC,GAAI5F,KAAK8P,MAAMlK,GAAGoB,OAASgJ,EAEzB,OAAO,EAGX,OAAO,EAGTjQ,gBAAgBwN,GAEdvN,KAAK0O,iBAAiB6B,gBAAgBhD,GAGxCxN,gBAAgBwN,GAEdvN,KAAK0O,iBAAiB8B,gBAAgBjD,GAGxCxN,SAASiQ,GAEP,IAAIM,EAAOtQ,KAAKmQ,iBAAiBH,GAEjChQ,KAAK+P,mBAAmBU,UAAUH,GAGpCvQ,mBAEE,OAAOC,KAAK+P,mBAAmBnB,cAGjC7O,iBAAiBiQ,GAEf,IAAK,IAAIpK,EAAI,EAAGA,EAAI5F,KAAK8P,MAAMlL,OAAQgB,IAErC,GAAI5F,KAAK8P,MAAMlK,GAAGoB,OAASgJ,EAEzB,OAAOhQ,KAAK8P,MAAMlK,GAGtB5C,QAAQG,MAAM,uCAAwC6M,GAIxDjQ,gBAAgBuC,GAEd,IAAK,IAAIsD,EAAI,EAAGA,EAAI5F,KAAK8P,MAAMlL,OAAQgB,IAErC,GAAI5F,KAAK8P,MAAMlK,GAAGtD,MAAQA,EAExB,OAAOtC,KAAK8P,MAAMlK,GAGtB5C,QAAQG,MAAM,uCAAwCb,GAIxDvC,uBAAuBmJ,GAErBlJ,KAAK0O,iBAAiBgC,uBAAuBxH,GAC7ClJ,KAAK+P,mBAAmBW,uBAAuBxH,GAGjDnJ,qBAAqBuC,GAEnB9B,OAAOmQ,QAAQC,UAAU,GAAI,GAAItO,KCjGtB,MAAMuO,WAAwBzC,GAE3CrO,aAAYiH,KAAEA,EAAI1E,IAAEA,EAAGwO,UAAEA,IAEvB/H,MAAM/B,GAENhH,KAAK8Q,UAAYA,EACjB9Q,KAAKsC,IAAMA,EAEX,IAAIiL,EAAc,CAChB,CACEhH,GAAIS,EACJjC,MAAM,IAAImH,IAAuBhK,MAAM6O,GAAkBxM,IAAI,GAAGyC,aAIpEgK,GAAYC,cAAcjR,MAC1BgR,GAAYT,gBAAgBhD,GAG9BxN,OAEEC,KAAK8Q,UAAUI,UAAUC,IAAI,gBAC7BnR,KAAK8Q,UAAUI,UAAUE,OAAO,eAChCpR,KAAK8Q,UAAUI,UAAUE,OAAO,UAGlCrR,WAEEC,KAAK8Q,UAAUI,UAAUE,OAAO,gBAChCpR,KAAK8Q,UAAUI,UAAUE,OAAO,eAChCpR,KAAK8Q,UAAUI,UAAUE,OAAO,UAGlCrR,cAEEC,KAAK8Q,UAAUI,UAAUC,IAAI,eAC7BnR,KAAK8Q,UAAUI,UAAUE,OAAO,gBAChCpR,KAAK8Q,UAAUI,UAAUE,OAAO,UAGlCrR,OAEEC,KAAK8Q,UAAUI,UAAUC,IAAI,UAC7BnR,KAAK8Q,UAAUI,UAAUE,OAAO,gBAChCpR,KAAK8Q,UAAUI,UAAUE,OAAO,eAGlCrR,YAAYsR,GAEVrR,KAAK8Q,UAAUQ,MAAMD,QAAUA,GCvDpB,MAAME,GAEnBxR,iBAGAA,YAGAA,WAGAA,UAGAA,kBAGAA,kBCjBa,MAAMyR,GAEnBzR,eAKAA,UAKAA,SAASkF,EAASwM,IAKlB1R,QAAQkF,EAASwM,IAKjB1R,UAKAA,gQCrBa,MAAM2R,WAA2BC,EAE9C5R,YAAY6R,EAAMC,EAAMC,GAEtB/I,MAAM,CACJgJ,aAAcH,GAAUI,GACxBC,eAAgBJ,GAAQK,GACxBJ,SAAUA,GAAc,CACtBK,OAAQ,CAAEzN,MAAO,IAAI0N,EAAM,gBCVpB,MAAMC,WAAoBjQ,GAEvCrC,YAAYsC,EAAaC,EAAKmP,EAAUa,EAAQ/P,GAE9CwG,MAAM1G,EAAaC,EAAKC,GAExBvC,KAAKsS,OAASA,EAEdtS,KAAKsS,OAAOC,eAAe,GAE3BvS,KAAKsS,OAAOE,kBACV,eAGFxS,KAAKsS,OAAOG,cAAchB,GAG5B1R,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMsQ,IAE1BA,EAAMC,SAAWC,EAEjB1P,EAAmB2P,aAAaL,EAAIrQ,YAAauQ,GAEjDF,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBCrCK,MAAMI,WAAqBzB,EAExC5R,YAAYsT,EAAaC,EAAaC,GAEpCxK,MAAM,CACJ+I,SAAU,CACR0B,SAAU,CAAE9O,MAAO,MACnB+O,YAAa,CAAE/O,MAAO,IAAIqJ,EAAQ,EAAG,IACrC2F,kBAAmB,CAAEhP,MAAO,IAAIqJ,EAAQ,EAAG,KAE7CwF,QAASA,GAAW,GACpBxB,aAAcuB,mGACdrB,eAAgBoB,uHAChBM,YAAY,EACZC,SAAUC,EACVC,WAAW,EACXC,UAAWC,KCNjB,OAAe,IAlBf,MAEEjU,OAEEC,KAAKiU,cAAWrN,EAGlBsN,YAAYC,GAEVnU,KAAKiU,SAAWE,EAGlBD,cAEE,OAAOlU,KAAKiU,WCJhB,OAAe,IAVf,MAEElU,OAEEC,KAAKoU,eAAiB,EACtBpU,KAAKqU,kCAAmC,EACxCrU,KAAKsU,uBAAwB,ICAlB,MAAMC,GAEnBxU,YAAYyU,GAEVxU,KAAKwU,kBAAoBA,EACzBxU,KAAKyU,aAAe,KAEpBzU,KAAK0U,OAASC,SAASC,cAAc,UACrC5U,KAAK0S,IAAM1S,KAAK0U,OAAOG,WAAW,MAGpC9U,cAAc+U,EAAY,SAExB,GAAyB,MAArB9U,KAAKyU,cAAwBzU,KAAKwU,kBACtC,CACE,IAAIrQ,EAAOwQ,SAASI,qBAAqB,QAAQ,GAC7CC,EAAQL,SAASC,cAAc,OAC/BK,EAAYN,SAASO,eAAe,eACxCF,EAAMG,YAAYF,GAClBD,EAAMI,aAAa,QAAS,QAAQN,oCACpC3Q,EAAKgR,YAAYH,GACjBhV,KAAKyU,aAAeO,EAAMK,aAC1BlR,EAAKmR,YAAYN,GAEnB,OAAOhV,KAAKyU,aAGd1U,cAAcwV,EAAMC,EAAO,cAEzB,IAAIjT,EAAO,IAAIwL,EAIf,OAHA/N,KAAK0S,IAAI8C,KAAOA,EAChBjT,EAAKwF,EAAIjB,KAAK2O,KAAKzV,KAAK0S,IAAIgD,YAAYH,GAAMI,OAC9CpT,EAAK0L,EAAInH,KAAK2O,KAAKzV,KAAK4V,cAAcJ,IAC/BjT,EAGTxC,YAAYwV,EAAMM,EAAa,IAM7B,OAJAA,EAAWL,KAAOK,EAAWL,MAAQ,aACrCK,EAAWC,WAAaD,EAAWC,YAAc,UAEjD9V,KAAK+V,OAAOR,EAAMM,EAAY7V,KAAK0U,OAAQ1U,KAAK0S,KACzC1S,KAAK0U,OAGd3U,gBAAgBwV,EAAMM,GAEpB,IAAInB,EAAS1U,KAAKgW,YAAYT,EAAMM,GAChCI,EAAiB,IAAIC,EAAcxB,EAAQyB,EAC7CC,EACAA,EACAC,EACAA,GAIF,OAHAJ,EAAeK,iBAAkB,EACjCL,EAAeM,aAAc,EAEtBN,EAGTlW,OAAOwV,EAAMM,IAGb9V,UAAU2S,EAAK3K,EAAGkG,EAAG0H,EAAOa,EAAQC,EAAQC,EAAMC,GAUhD,QARsB,IAAXA,IAETA,GAAS,QAEW,IAAXF,IAETA,EAAS,GAEW,iBAAXA,EAETA,EAAS,CAAEG,GAAIH,EAAQI,GAAIJ,EAAQK,GAAIL,EAAQM,GAAIN,OAGrD,CACE,IAAIO,EAAgB,CAAEJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GAC/C,IAAK,IAAIE,KAAQD,EAEfP,EAAOQ,GAAQR,EAAOQ,IAASD,EAAcC,GAGjDvE,EAAIwE,YACJxE,EAAIyE,OAAOpP,EAAI0O,EAAOG,GAAI3I,GAC1ByE,EAAI0E,OAAOrP,EAAI4N,EAAQc,EAAOI,GAAI5I,GAClCyE,EAAI2E,iBAAiBtP,EAAI4N,EAAO1H,EAAGlG,EAAI4N,EAAO1H,EAAIwI,EAAOI,IACzDnE,EAAI0E,OAAOrP,EAAI4N,EAAO1H,EAAIuI,EAASC,EAAOK,IAC1CpE,EAAI2E,iBAAiBtP,EAAI4N,EAAO1H,EAAIuI,EAAQzO,EAAI4N,EAAQc,EAAOK,GAAI7I,EAAIuI,GACvE9D,EAAI0E,OAAOrP,EAAI0O,EAAOM,GAAI9I,EAAIuI,GAC9B9D,EAAI2E,iBAAiBtP,EAAGkG,EAAIuI,EAAQzO,EAAGkG,EAAIuI,EAASC,EAAOM,IAC3DrE,EAAI0E,OAAOrP,EAAGkG,EAAIwI,EAAOG,IACzBlE,EAAI2E,iBAAiBtP,EAAGkG,EAAGlG,EAAI0O,EAAOG,GAAI3I,GAC1CyE,EAAI4E,YACAZ,GAEFhE,EAAIgE,OAEFC,GAEFjE,EAAIiE,UCtFV,OAAe,IAff,MAEE5W,KAAKwX,EAAa,IAEhBvX,KAAKwX,IAAM,EAEXxX,KAAKyX,IAAO,GAGd1X,UAAU2X,MCfG,MAAMC,GAEnB5X,eAIA6X,mBAEE,OAAO,EAGT7X,SAASuQ,IAKTvQ,OAAOuQ,IAIPvQ,QAAQuQ,KCfK,MAAMuH,GAEnB9X,cAEEC,KAAKyI,EAAI,EACTzI,KAAK8X,kBAAoB,EAG3BF,mBAEE,OAAO,EAGT7X,SAASgY,IAIThY,OAAOgY,GAEL/X,KAAKyI,GAAK4G,GAAKrJ,WAAa+R,EAASlS,SAErC7F,KAAK8X,kBAAoBC,EAASnP,gBAAgB5I,KAAKyI,GACvDzI,KAAK8X,kBAAoB7R,EAAMC,MAAMlG,KAAK8X,kBAAmB,EAAG,GAEhEC,EAASC,mBAAmB/R,EAAM+C,KAAK+O,EAASzR,KAAMyR,EAASxR,GAAIvG,KAAK8X,oBAEpE9X,KAAK8X,mBAAqB,QAE5BC,EAASC,mBAAmBD,EAASxR,IAErCwR,EAASE,kBAAkB,IAAIN,IAC/BI,EAASG,kBAAkBH,IAI/BhY,QAAQuQ,KCpCK,MAAM6H,GAEnBpY,aAAYyJ,QACVA,EAAO4O,aACPA,EAAY9R,KACZA,EAAO,EAACC,GACRA,EAAK,EAACV,SACNA,EAAW,EAACwS,aACZA,EAAe,GAAEC,aACjBA,EAAgB,GAAE1P,gBAClBA,EAAkBC,GAAgB0P,kBAAiBL,kBACnDA,EAAoB,WAIpBlY,KAAKwJ,QAAUA,EACfxJ,KAAKoY,aAAeA,EACpBpY,KAAKsG,KAAOA,EACZtG,KAAKuG,GAAKA,EACVvG,KAAKqY,aAAeA,EACpBrY,KAAKsY,aAAeA,EACpBtY,KAAK6F,SAAWA,EAChB7F,KAAK4I,gBAAkBA,EACvB5I,KAAKkY,kBAAoBA,EAEzBlY,KAAK4O,cAAgB,IAAI+I,GAG3B5X,UAEEC,KAAKiY,kBAAkB,IAAIJ,IAG7B9X,OAEEC,KAAKiY,kBAAkB,IAAIN,IAG7B5X,mBAAmB2E,GAEjB1E,KAAKwJ,QAAQ8H,MAAMtR,KAAKoY,cAAgB,GAAGpY,KAAKqY,eAAe3T,IAAQ1E,KAAKsY,eAG9EvY,SAEEC,KAAK4O,cAAcQ,OAAOpP,MAG5B4X,mBAEE,OAAO5X,KAAK4O,cAAcgJ,aAG5B7X,kBAAkB+J,GAEhB9J,KAAK4O,cAAce,QAAQ3P,MAC3BA,KAAK4O,cAAgB9E,EACrB9J,KAAK4O,cAAcgB,SAAS5P,OCrDjB,MAAMwY,WAAmBC,EAEtC1Y,YAAY2Y,EAAQ,GAElB3P,QAEA,MAAM4P,EAAc,GACpBA,EAAYtS,KAAK,IAAIuS,EAAQ,EAAG,EAAG,IACnCD,EAAYtS,KAAK,IAAIuS,EAAQ,EAAG,EAAG,MAEnC,MAAMC,EAAgB,IAAIC,EAAkB,CAAEC,MAAO,QAAUhF,UAAWC,IACpEgF,GAAgB,IAAIC,GAAiBC,cAAcP,GACnDQ,EAAiB,IAAIC,EAAKJ,EAAeH,GAC/CM,EAAeE,YAAc,IAE7B,MAAMC,EAAe,GACrBA,EAAajT,KAAK,IAAIuS,EAAQ,EAAG,EAAG,IACpCU,EAAajT,KAAK,IAAIuS,EAAQ,EAAG,IAAM,IAEvC,MAAMW,EAAiB,IAAIT,EAAkB,CAAEC,MAAO,QAAUhF,UAAWC,IACrEwF,GAAiB,IAAIP,GAAiBC,cAAcI,GACpDG,EAAkB,IAAIL,EAAKI,EAAgBD,GACjDE,EAAgBJ,YAAc,IAE9B,MAAMK,EAAa,GACnBA,EAAWrT,KAAK,IAAIuS,EAAQ,EAAG,EAAG,IAClCc,EAAWrT,KAAK,IAAIuS,EAAQ,IAAM,EAAG,IAErC,MAAMe,EAAe,IAAIb,EAAkB,CAAEC,MAAO,SAAUhF,UAAWC,IACnE4F,GAAe,IAAIX,GAAiBC,cAAcQ,GAClDG,EAAgB,IAAIT,EAAKQ,EAAcD,GAC7CE,EAAcR,YAAc,IAE5BrZ,KAAKqZ,YAAc,IAEnBrZ,KAAKmR,IAAIgI,GACTnZ,KAAKmR,IAAIsI,GACTzZ,KAAKmR,IAAI0I,GAET7Z,KAAK0Y,MAAMoB,IAAIpB,EAAOA,EAAOA,GAG/B3Y,UAIAA,YCXF,OAAe,IAzCf,MAEEA,OAEEC,KAAKiU,SAAW,IAAI8F,EACpB/Z,KAAKiU,SAASjN,KAAO,gBAGvBjH,UAAUiH,IAKVkN,cAEE,OAAOlU,KAAKiU,SAGdC,YAAY8F,GAEVha,KAAKiU,SAAW+F,EAGlBja,UAWE,IATAC,KAAKkU,QAAQ+F,UAASC,IAEhBA,EAAMC,WAERD,EAAMC,SAASC,UACfF,EAAMG,SAASD,cAIZpa,KAAKkU,QAAQoG,SAAS1V,OAAS,GAEpC5E,KAAKkU,QAAQ9C,OAAOpR,KAAKkU,QAAQoG,SAAS,MCjCjC,MAAMC,WAAaC,EAEhCza,YAAYwC,EAAMkY,EAAU1B,GAE1BxW,EAAWA,GAAQ,IAAIqW,EAAQ,EAAG,EAAG,GACrC6B,EAAWA,GAAY,IAAI7B,EAAQ,EAAG,EAAG,GACzCG,EAAWA,GAAS,SAGpBhQ,MAFe,IAAI2R,EAAYnY,EAAKwF,EAAGxF,EAAK0L,EAAG1L,EAAKoY,EAAGF,EAAS1S,EAAG0S,EAASxM,EAAGwM,EAASE,GACzE,IAAIC,EAAkB,CAAE7B,MAAOA,MCTnC,MAAM8B,WAAeL,EAElCza,YAAY0W,EAAQsC,GAElBA,EAAQA,GAAS,UAIjBhQ,MAFe,IAAI+R,EADnBrE,EAASA,GAAU,EAC6B,GAAI,IACrC,IAAImE,EAAkB,CAAE7B,MAAOA,MCJnC,MAAMgC,WAAcP,EAEjCza,YAAYgZ,EAAOnU,EAAQoW,GAEzBjC,EAAQA,GAAS,UAGjB,IACIkC,GAHJrW,EAASA,GAAU,GAED,GAEdsW,EAAe,IAAIC,EAAuB,IAAM,IAAMF,EAAiB,IAC3EC,EAAaE,UAAU,EAAGH,EAAkB,EAAG,GAE/C,IAAII,EAAgB,IAAIC,EAAmB,GALzB,GAK2C,IAC7DD,EAAcD,UAAU,EAAGH,EAAkBM,GAAiB,GAE9D,IAAIC,EAAkBC,GAAoBC,sBAAsB,CAACR,EAAcG,IAC/EG,EAAgBG,QAAQ,MAGxB5S,MAAMyS,EADS,IAAIZ,EAAkB,CAAE7B,MAAOA,KAG1CiC,GAEFhb,KAAK4b,WAAWC,mBAAmB,IAAIjD,EAAQ,EAAG,EAAG,GAAIoC,GAG3Dhb,KAAK8b,KAAOd,EAGdA,QAAQA,GAENhb,KAAK4b,WAAWC,mBAAmB,IAAIjD,EAAQ,EAAG,EAAG,GAAIoC,GACzDhb,KAAK8b,KAAOd,EAGdA,UAEE,OAAOhb,KAAK8b,KAGdlX,WAAWF,GAET1E,KAAK0Y,MAAMiC,EAAIjW,EAGjBE,aAEE,OAAO5E,KAAK0Y,MAAMiC,GCOtB,OAAe,IA3Df,MAEE5a,OAEEC,KAAK2V,MAAQ,EACb3V,KAAKwW,OAAS,EAEdxW,KAAK+b,SAAW,IAAIhO,EAEpB/N,KAAKgc,aAAe,EACpBhc,KAAKic,cAAgB,EACrBjc,KAAKkc,aAAe,IAAInO,EAAQ/N,KAAK2V,MAAO3V,KAAKwW,QAEjDxW,KAAKwX,IAAM,EACXxX,KAAKmc,WAAa,IAAIpO,EAAQ,EAAI/N,KAAK2V,MAAO,EAAI3V,KAAKwW,QAGzDzW,gBAAgBgI,EAAGkG,GAEjBjO,KAAK+b,SAASjC,IAAI/R,EAAGkG,GAGvBlO,YAAY4V,EAAOa,GAEjBxW,KAAK2V,MAAQA,EACb3V,KAAKwW,OAASA,EAEdxW,KAAKmc,WAAa,IAAIpO,EAAQ,EAAI/N,KAAK2V,MAAO,EAAI3V,KAAKwW,QAEvDxW,KAAKkc,aAAanU,EAAI4N,EACtB3V,KAAKkc,aAAajO,EAAIuI,EAEtBxW,KAAKgc,aAAerG,EAAQ3V,KAAKwX,IACjCxX,KAAKic,cAAgBzF,EAASxW,KAAKwX,IAGrCzX,uBAAuBqc,GAIrB,OAFAA,EAAQC,eAAe,EAAIrc,KAAKwX,KAEzB4E,EAGTrc,oBAAoB2E,GAElB,OAAOA,GAAS,EAAI1E,KAAKwX,KAG3BzX,iBAEE,OAAOC,KAAKmc,WAGdG,mBAEE,OAAOtc,KAAK2V,MAAQ3V,KAAKwW,SCvDd,MAAM+F,WAAmC7K,GAEtD3R,YAAYgI,EAAGkG,EAAGuO,EAAGC,GA4BnB1T,MA1BW,ogBAiBA,8JASO,CAChByK,SAAU,CAAE9O,WAAOkC,GACnB8V,qBAAsB,CAAEhY,MAAO,IAAIqJ,GACnC4O,YAAa,CAAEjY,MAAO,IAAIqJ,GAC1B6O,aAAc,CAAElY,MAAO,IAAIqJ,KAI/BhO,aAAagI,EAAGkG,GAEdjO,KAAK8R,SAAS4K,qBAAqBhY,MAAMoV,IAAI/R,EAAGkG,GAGlDlO,YAAY8c,EAAKL,EAAGC,GAElBzc,KAAK8R,SAAS0B,SAAS9O,MAAQmY,EAC/B7c,KAAK8R,SAAS8K,aAAalY,MAAMoV,IAAI+C,EAAIC,MAAMnH,MAAOkH,EAAIC,MAAMtG,aAEtD5P,IAAN4V,IAEFxc,KAAK8R,SAAS8K,aAAalY,MAAMqD,EAAIyU,QAE7B5V,IAAN6V,IAEFzc,KAAK8R,SAAS8K,aAAalY,MAAMuJ,EAAIwO,GAIzC1c,gBAAgByc,EAAGC,GAEjBzc,KAAK8R,SAAS6K,YAAYjY,MAAMoV,IAAI0C,EAAGC,IC4L3C,OAAe,IAnOf,MAEE1c,OAEEC,KAAK+c,YAAc,IAAInE,EAAQ,EAAG,EAAG,GACrC5Y,KAAKgd,aAAe,IAAIpE,EAAQ,EAAG,EAAG,GACtC5Y,KAAKid,qBAAkBrW,EAEvB5G,KAAKkd,uBAAyB,GAE9Bld,KAAK0S,SAAM9L,EAGb7G,WAAWod,EAAQnC,EAAKjC,EAAQ,UAE9B,IAAIqE,EAAQ,IAAIrC,GAAMhC,EAAOiC,EAAIpW,SAAUoW,EAAIqC,QAAQC,aAGvD,OAFAF,EAAMrB,SAASwB,KAAKJ,GACpBK,GAAatJ,QAAQ/C,IAAIiM,GAClBA,EAGTrd,YAEE,IAAI0d,EAAO,IAAIjF,GAEf,OADAgF,GAAatJ,QAAQ/C,IAAIsM,GAClBA,EAGT1d,aAAa2d,GAEX1d,KAAK2d,SAAWD,EAGlB3d,eAAe6d,EAAajI,EAAOa,EAAQuC,GAEzCpD,EAASA,GAAS,IAClBa,EAASA,GAAU,IACnBxW,KAAK0S,IAAImL,UAAa9E,GAAS,qBAC/B/Y,KAAK0S,IAAIoL,SAASF,EAAY7V,EAAI4N,EAAQ,EACvC3V,KAAK0S,IAAIgC,OAAO8B,OAASoH,EAAY3P,EAAKuI,EAAS,EAAGb,EAAOa,GAGlEzW,QAEMC,KAAK0S,KAEP1S,KAAK0S,IAAIqL,UAAU,EAAG,EAAG/d,KAAK0S,IAAIgC,OAAOiB,MAAO3V,KAAK0S,IAAIgC,OAAO8B,QAIpEzW,aAAauG,EAAMC,EAAIwS,GAErB/Y,KAAK0S,IAAIsL,YAAejF,GAAS,qBACjC/Y,KAAK0S,IAAIwE,YACTlX,KAAK0S,IAAIyE,OAAO7Q,EAAKyB,EAAGzB,EAAK2H,GAC7BjO,KAAK0S,IAAI0E,OAAO7Q,EAAGwB,EAAGxB,EAAG0H,GACzBjO,KAAK0S,IAAI4E,YACTtX,KAAK0S,IAAIiE,SAGX5W,UAAUke,EAAQlF,EAAQ,UAExB,IAAIsB,EAAW,IAAIvB,EAAkB,CACnCC,MAAOA,IAGLoB,GAAW,IAAIlB,GAAiBC,cAAc+E,GAE9CC,EAAO,IAAI9E,EAAKe,EAAUE,GAG9B,OAFA6D,EAAKC,eAAgB,EACrBX,GAAatJ,QAAQ/C,IAAI+M,GAClBA,EAGTne,UAAUqe,EAAK7b,EAAMwW,GAEnBxW,EAAOA,GAAQ,EACfwW,EAAQA,GAAS,SACjBqF,EAAMA,GAAO,IAAIxF,EAEjB,IAAIyF,EAAO,IAAI9D,GAAK,IAAI3B,EAAQrW,EAAMA,EAAMA,QAAOqE,EAAWmS,GAG9D,OAFAsF,EAAKtC,SAASwB,KAAKa,GACnBZ,GAAatJ,QAAQ/C,IAAIkN,GAClBA,EAGTte,mBAAmBuG,EAAMC,EAAIiQ,EAAS,EAAGuC,EAAQ,UAAWuF,EAAQ,IAElE,IAAI/b,EAAO+D,EAAKiY,WAAWhY,GACvB8X,EAAO,IAAI9D,GAAK,IAAI3B,EAAQ0F,EAAO9H,EAAQjU,QAAOqE,EAAWmS,GAE7DyF,EAASjY,EAAG8W,QAAQoB,IAAInY,GAAM+V,eAAe,IAC7CqC,EAAcF,EAAOnB,QAAQC,YAajC,OAZAkB,EAAOrN,IAAI7K,GAEX+X,EAAKtC,SAASwB,KAAKiB,GAOnBH,EAAKzC,WAAWC,mBAAmB,IAAIjD,EAAQ,EAAG,GAAI,GAAI8F,GAE1DlB,GAAatJ,QAAQ/C,IAAIkN,GAClBA,EAGTte,WAAW4V,EAAOa,EAAQuC,GAExB,IAAIoB,EAAW,IAAIwE,EAAoBhJ,EAAOa,GAC1C6D,EAAW,IAAI1I,EAAe,CAChCG,SAAU,CACRK,OAAQ,CAAEzN,MAAO,IAAIka,EAAQ,EAAG,EAAG,EAAG,MAExC7M,aAAc8M,GACd5M,eAAgB6M,GAChBC,aAAa,EACbpL,YAAY,IAGVqL,EAAQ,IAAIxE,EAAKL,EAAUE,GAG/B,OAFA2E,EAAM3F,aAAe,IACrBmE,GAAatJ,QAAQ/C,IAAI6N,GAClBA,EAGTjf,gBAAgBqe,EAAK7b,EAAMwW,GAEzBxW,EAAOA,GAAQ,EACfwW,EAAQA,GAAS,SAEjB,IAAIkG,GAAM,IAAIC,GAAOC,qBAAqB,IAAIvG,EAAW,IAAIA,EAAQrW,EAAMA,EAAMA,IAC7E6c,EAAS,IAAIC,EAAWJ,EAAKlG,GAEjC,OADAqG,EAAOrD,SAASwB,KAAKa,GAAO,IAAIxF,GACzBwG,EAGTrf,YAAYqe,EAAK7b,EAAMwW,GAErBxW,EAAOA,GAAQ,EACfwW,EAAQA,GAAS,SACjBqF,EAAMA,GAAO,IAAIxF,EAEjB,IAAI0G,EAAS,IAAIzE,GAAOtY,EAAMwW,GAG9B,OAFAuG,EAAOvD,SAASwB,KAAKa,GACrBZ,GAAatJ,QAAQ/C,IAAImO,GAClBA,EAGTvf,iBAAiBwf,EAAcC,GAAO,EAAOzG,EAAQ,UAEnD,IAAI0G,EAAU,IAAIC,EAAiBH,EAAcC,GACjDC,EAAQE,mBACR,IAAI1B,EAASwB,EAAQG,gBAAgB,KAGrC,OAFkB5f,KAAK6f,UAAU5B,EAAQ,OAK3Cle,mBAAmBuf,EAAQvG,GAEzBA,EAAQA,GAAS,SACjB,IAAIoB,EAAW,IAAI2F,EAAeR,EAAO7I,OAAQ,GAAI,IACjD4D,EAAW,IAAIO,EAAkB,CAAE7B,MAAOA,IAC1CgH,EAAc,IAAIvF,EAAKL,EAAUE,GAGrC,OAFA0F,EAAYhE,SAASwB,KAAK+B,EAAOd,QACjChB,GAAatJ,QAAQ/C,IAAI4O,GAClBA,EAGThgB,iBAAiBuf,GAEf,IAAInF,EAAW,IAAI2F,EAAeR,EAAO7I,OAAQ,GAAI,IACjD4D,EAAW,IAAI1I,EAAe,CAChCG,SAAU,CACRK,OAAQ,CAAEzN,MAAO,IAAIka,EAAQ,EAAG,EAAG,EAAG,MAExC7M,aAAc8M,GACd5M,eAAgB6M,GAChBC,aAAa,IAGXiB,EAAU,IAAIxF,EAAKL,EAAUE,GACjC2F,EAAQjE,SAASwB,KAAK+B,EAAOd,QAC7BhB,GAAatJ,QAAQ/C,IAAI6O,GAG3BjgB,kBAAkBkgB,GAEhB,IAAIb,EAAS,IAAIC,EAAWY,EAAI,UAChCzC,GAAatJ,QAAQ/C,IAAIiO,GAG3Brf,WAAWmgB,EAAOC,GAEhB,IAAIC,EAAS,IAAIxH,EAAQ,EAAG,EAAG,GAC3BuH,IAEFC,EAAOnS,EAAIkS,EAAQC,QAAU,GAG/B,IAAK,IAAIxa,EAAI,EAAGA,EAAIsa,EAAMtb,OAAS,EAAGgB,IAEpC5F,KAAK6f,UAAUK,EAAMta,GAAGyX,QAAQlM,IAAIiP,GAASF,EAAMta,EAAI,GAAGyX,QAAQlM,IAAIiP,IAI1ErgB,aAAa8c,EAAKL,EAAGC,GAEnB,IAAI4D,EAAO,IAAI7F,EAAK,IAAImE,EAAoB,EAAG,GAAI,IAAIpC,IAKvD,OAJAvc,KAAKkd,uBAAuB7W,KAAKga,GACjC7C,GAAatJ,QAAQ/C,IAAIkP,GAEzBA,EAAKhG,SAASiG,YAAYzD,EAAKL,EAAGC,GAC3B4D,EAGTtgB,SAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKkd,uBAAuBtY,OAAQgB,IAEtD5F,KAAKkd,uBAAuBtX,GAAGyU,SAASkG,gBAAgBC,GAAO7K,MAAO6K,GAAOhK,UChPpE,MAAMiK,WAAiCrN,GAEpDrT,YAAY2gB,EAAaC,GAEvB5X,2aACA/I,KAAK8R,SAAS8O,aAAe,CAAElc,MAAO,IAAIka,EAAQ8B,EAAaC,EAAa5Y,EAAG4Y,EAAa1S,EAAG0S,EAAahG,KCLjG,MAAMkG,WAA4BlP,EAE/C5R,cAEEgJ,MAAM,CACJ+I,SAAU,CACRgP,UAAW,CAAEpc,MAAO,IAEtBqN,6QACAE,+dAIJ8O,cAAcrc,GAEZ1E,KAAK8R,SAASgP,UAAUpc,MAAQA,EAGlCqc,gBAEE,OAAO/gB,KAAK8R,SAASgP,UAAUpc,OChBpB,MAAMsc,GAEnBjhB,cAEEC,KAAK0d,GAAK,IAAIuD,EAAkBT,GAAO7K,MAAO6K,GAAOhK,QAErDxW,KAAKkhB,uBAAyB,IAAIT,GAAyB,EAAG,IAAI7H,EAAQ,EAAG,EAAG,IAChF5Y,KAAKmhB,sBAAwB,IAAIN,GAGnC9gB,OAAOqhB,GAELphB,KAAKqhB,2BAELD,EAASE,MAAMthB,KAAK0d,QAAI9W,GAAW,GAAM,GAEzCwa,EAASG,yBAAyBvhB,KAAK0d,GAAI1d,KAAKkhB,wBAEhDlhB,KAAKmhB,sBAAsBJ,UAAYS,GAActN,QAAQuN,IAE7DL,EAASM,YAAO9a,OAAWA,EAAW5G,KAAK0d,GAAI1d,KAAKmhB,uBAGtDphB,2BAEMC,KAAK0d,GAAG/H,QAAU6K,GAAO7K,OAAS3V,KAAK0d,GAAGlH,SAAWgK,GAAOhK,QAE9DxW,KAAK0d,GAAGiE,QAAQnB,GAAO7K,MAAO6K,GAAOhK,QAIzCoL,oBAEE,OAAO5hB,KAAK0d,ICnCD,MAAMmE,GAEnB9hB,YAAY0R,GAEVzR,KAAKyR,SAAWA,EAChBzR,KAAK8hB,YAAc,IAAI/H,EACvB/Z,KAAK+hB,eAAiB,IAAI3O,GAC1BpT,KAAKgiB,WAAa,IAAIxH,EACpB,IAAImE,EAAoB,EAAG,GAAI3e,KAAK+hB,gBACtC/hB,KAAK8hB,YAAY3Q,IAAInR,KAAKgiB,YAC1BhiB,KAAKiiB,aAAe,IAAIC,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAO,KAGnEniB,KAAKoiB,EAAKC,GAERpiB,KAAKgiB,WAAW3H,SAAWra,KAAK+hB,eAEhC,IAAIM,GAA0C,IAA5BF,EAAIG,oBAA+BH,EAAII,QAAUJ,EAC/DK,GAA0C,IAA5BL,EAAIG,oBAA+BH,EAAIxM,MAAUwM,EAAIrF,MAAMnH,MACzE8M,GAA0C,IAA5BN,EAAIG,oBAA+BH,EAAI3L,OAAU2L,EAAIrF,MAAMtG,OAE7ExW,KAAKgiB,WAAW3H,SAASvI,SAAS0B,SAAS9O,MAAQ2d,EACnDriB,KAAKgiB,WAAW3H,SAASvI,SAAS2B,YAAY/O,MAAMoV,IAAI0I,EAAWC,GAE/DL,EAEFpiB,KAAKgiB,WAAW3H,SAASvI,SAAS4B,kBAAkBhP,MAAMoV,IAAIsI,EAAIzM,MAAOyM,EAAI5L,QAI7ExW,KAAKyR,SAASiR,QAAQ1iB,KAAKgiB,WAAW3H,SAASvI,SAAS4B,kBAAkBhP,OAG5E1E,KAAK2iB,SAASP,GAGhBriB,cAAc6iB,EAAKR,GAEjBpiB,KAAKgiB,WAAW3H,SAAWuI,EAC3B5iB,KAAKgiB,WAAW3H,SAASvI,SAAS0B,SAAS9O,WAAQkC,EACnD5G,KAAKgiB,WAAW3H,SAASvI,SAAS2B,YAAY/O,MAAMoV,IAAI,EAAG,GAE3D9Z,KAAK2iB,SAASP,GAGhBriB,mBAAmBoiB,EAAKC,EAAKQ,GAE3B,IAAIP,GAA0C,IAA5BF,EAAIG,oBAA+BH,EAAII,QAAUJ,EAC/DK,GAA0C,IAA5BL,EAAIG,oBAA+BH,EAAIxM,MAAUwM,EAAIrF,MAAMnH,MACzE8M,GAA0C,IAA5BN,EAAIG,oBAA+BH,EAAI3L,OAAU2L,EAAIrF,MAAMtG,OAE7ExW,KAAKgiB,WAAW3H,SAAWuI,EAC3B5iB,KAAKgiB,WAAW3H,SAASvI,SAAS0B,SAAS9O,MAAQ2d,EACnDriB,KAAKgiB,WAAW3H,SAASvI,SAAS2B,YAAY/O,MAAMoV,IAAI0I,EAAWC,GAE/DL,EAEFpiB,KAAKgiB,WAAW3H,SAASvI,SAAS4B,kBAAkBhP,MAAMoV,IAAIsI,EAAIzM,MAAOyM,EAAI5L,QAI7ExW,KAAKyR,SAASiR,QAAQ1iB,KAAKgiB,WAAW3H,SAASvI,SAAS4B,kBAAkBhP,OAG5E1E,KAAK2iB,SAASP,GAGhBriB,yBAAyB8iB,EAAQD,GAE/B5iB,KAAKgiB,WAAW3H,SAAWuI,EAE3B5iB,KAAK2iB,SAASE,GAGhB9iB,UAEEC,KAAKgiB,WAAW7H,SAASC,UACzBpa,KAAKgiB,WAAW3H,SAASD,UAG3Bra,SAAS2d,GAEPA,OAAY9W,IAAP8W,EAAmB,KAAOA,EAE/B,IAAIoF,EAAa9iB,KAAKyR,SAASsR,kBAE/B/iB,KAAKyR,SAASuR,qBAAuBpc,IAAP8W,EAAmB,KAAOA,GACxD1d,KAAKyR,SAASiQ,OAAO1hB,KAAK8hB,YAAa9hB,KAAKiiB,cAE5CjiB,KAAKyR,SAASuR,gBAAgBF,IC6NlC,OAAe,IAlTf,MAEE/iB,KAAK2U,EAAQuO,GAEXjgB,QAAQkgB,IAAI,iBACZljB,KAAKmjB,eAAYvc,EACjB5G,KAAKojB,aAAUxc,EACf5G,KAAK0U,YAAS9N,EACd5G,KAAKqjB,eAAYzc,EACjB5G,KAAKsjB,yBAAsB1c,EAC3B5G,KAAKujB,4BAA6B,EAClCvjB,KAAKwjB,gCAA6B5c,EAElC5G,KAAKyjB,WAAY,EACjBzjB,KAAK0jB,oBAAiB9c,EACtB5G,KAAKijB,wBAAqBrc,EAE1B5G,KAAKijB,mBAAqBA,GAAsB,CAC9CU,OAAO,EACPrF,OAAO,EACPsF,gBAAgB,EAChBC,SAAS,EACTC,WAAW,EACXC,oBAAoB,EACpBC,uBAAuB,EACvBC,gBAAiB,mBACjBC,wBAAwB,GAGtBjB,EAAmBkB,aAErBnkB,KAAK0jB,eAAiBhP,EAAOG,WAAW,SAAU7U,KAAKijB,qBACjCvO,EAAOG,WAAW,QAAS7U,KAAKijB,qBAChCvO,EAAOG,WAAW,qBAAsB7U,KAAKijB,oBAInEjjB,KAAK0jB,eAAiBhP,EAAOG,WAAW,QAAS7U,KAAKijB,qBAChCvO,EAAOG,WAAW,qBAAsB7U,KAAKijB,oBAGrEjjB,KAAKyjB,UAAqD,2BAAzCzjB,KAAK0jB,eAAeU,YAAYpd,KAEjDhE,QAAQkgB,IAAI,gBAAeljB,KAAKyjB,UAAY,EAAI,IAEhDzjB,KAAKmjB,UAAY,IAAIkB,EAAc,CACjC3P,OAAQA,EACRzP,QAASjF,KAAK0jB,iBAEhB1jB,KAAKmjB,UAAUmB,WAAY,EAE3BtkB,KAAKmjB,UAAUoB,cAAc,GAE7B/D,GAAOhJ,IAAMgN,GAAchN,IAEtBxX,KAAKyjB,WAERzjB,KAAKmjB,UAAUsB,WAAWlgB,IAAI,0BAGhCvE,KAAKojB,QAAU,IAAIvB,GAAQ7hB,KAAKmjB,WAEhCnjB,KAAK0U,OAAS1U,KAAKmjB,UAAUuB,WAE7B1kB,KAAKqjB,UAAY,IAAI7R,GAErBxR,KAAKsjB,oBAAsBtjB,KAAKqjB,UAChCsB,GAAavQ,eAAiBpU,KAAKmjB,UAAUyB,aAAaC,mBAC1DF,GAAatQ,iCAAmCrU,KAAKmjB,UAAUyB,aAAaE,kBAAoB,EAChGH,GAAarQ,sBAAwBtU,KAAKmjB,UAAUyB,aAAaG,oBAEjE/kB,KAAKujB,4BAA6B,EAElCvjB,KAAKwjB,2BAA6B,IAAIxC,GAGxCgE,kBAEE,OAAOhlB,KAAKmjB,UAAUuB,WAGxBO,uBAEE,OAAOjlB,KAAKwjB,2BAA2B5B,cAGzC7hB,UAAUmlB,GAIRllB,KAAKsjB,oBAAoB3T,QAAQ3P,KAAMA,KAAKmjB,WAC5CnjB,KAAKsjB,oBAAsB4B,EAC3BllB,KAAKsjB,oBAAoB1T,SAAS5P,KAAMA,KAAKmjB,WAG/CpjB,SAEEC,KAAKmlB,mBAEDnlB,KAAKujB,4BAEPvjB,KAAKwjB,2BAA2B9B,OAAO1hB,MAGzCA,KAAKolB,0BAED5D,GAActN,SAEhBlU,KAAKsjB,oBAAoB5B,SAI7B3hB,0BAEMyhB,GAActN,UAEhBsN,GAActN,QAAQmR,OAAS7E,GAAOlE,aACtCkF,GAActN,QAAQoR,yBACtB9D,GAActN,QAAQqR,eACtB/D,GAActN,QAAQsR,mBAAkB,IAI5CzlB,OAAOia,EAAO7F,EAAQuJ,EAAI+H,GAExBzlB,KAAK0lB,0BAA0B1L,EAAOyL,GAEtCzlB,KAAKmjB,UAAUH,qBAAuBpc,IAAP8W,EAAmB,KAAOA,GACzD1d,KAAKmjB,UAAUzB,OAAO1H,GAAUwD,GAAatJ,QAC3CC,GAAUqN,GAActN,SAE1BlU,KAAK0lB,0BAA0B1L,OAAOpT,GAGxC7G,0BAA0Bia,EAAO4I,GAE/BA,OAAchc,IAARgc,EAAoB,KAAOA,EAC7B5I,EAEFA,EAAM2L,iBAAmB/C,EAIzBpF,GAAatJ,QAAQyR,iBAAmB/C,EAI5C7iB,YAAY2d,EAAIkI,GAEd5lB,KAAKmjB,UAAU0C,uBAAuBnI,EAAI,EAAG,EAAGA,EAAG/H,MAAO+H,EAAGlH,OAAQoP,GAGvE7lB,MAAM2d,EAAIvJ,EAAQuM,EAAaoF,GAE7B9lB,KAAKmjB,UAAUH,qBAAuBpc,IAAP8W,EAAmB,KAAOA,GAErDvJ,GAEFnU,KAAKmjB,UAAU4C,cAAc5R,EAAO6R,YAAa7R,EAAO8R,aAG1DjmB,KAAKmjB,UAAU7B,QAAQnN,IACnBuM,IACAoF,GAGN/lB,mBAEEiD,QAAQkgB,IAAI,oBACZ,IAAIgD,EAAkBlmB,KAAK0U,OAAOyR,YAC9BC,EAAkBpmB,KAAK0U,OAAO2R,aAElC,GACEH,IAAmB1F,GAAO7K,OAC1ByQ,IAAmB5F,GAAOhK,QAC1BgO,GAAchN,MAAQgJ,GAAOhJ,IAE/B,CACE,IAAI8O,EAActmB,KAAK0U,OAAO6R,wBAE9B/F,GAAOhJ,IAAMgN,GAAchN,IAC3BgJ,GAAOgG,gBAAgBF,EAAYve,EAAGue,EAAYrY,GAClDuS,GAAOiG,YAAYP,EAAeE,GAElCpmB,KAAK0U,OAAOiB,MAAS6K,GAAOxE,aAC5Bhc,KAAK0U,OAAO8B,OAASgK,GAAOvE,cAE5Bjc,KAAKmjB,UAAUuD,YAAY,EAAG,EAAGlG,GAAOxE,aAAcwE,GAAOvE,eAE7Djc,KAAKolB,2BAITrlB,YAEEiD,QAAQG,MAAM,6CAGhBpD,cAAc6iB,EAAKR,GAEjBpiB,KAAKojB,QAAQuD,cAAc/D,EAAKR,GAGlCriB,KAAK6mB,EAAQ/D,EAAQD,GAEfA,EAEF5iB,KAAKojB,QAAQyD,mBAAmBD,EAAQ/D,EAAQD,GAIhD5iB,KAAKojB,QAAQ0D,KAAKF,EAAQ/D,GAI9B9iB,yBAAyB8iB,EAAQD,GAE/B5iB,KAAKojB,QAAQ7B,yBAAyBsB,EAAQD,GAGhD7iB,gBAAgBgnB,EAAepR,EAAQ6K,GAAO7K,MAAOa,EAASgK,GAAOhK,QAInE,IAAIwQ,EAAYxG,GAAO7K,MACnBsR,EAAazG,GAAOhK,OAEpB0Q,EAAYvR,EACZwR,EAAa3Q,EAEb4Q,EAAa,KACbC,EAAc,KAEdC,EAAcC,SAASzgB,KAAK2O,KAAKyR,EAAYE,IAC7CI,EAAcD,SAASzgB,KAAK2O,KAAK0R,EAAaE,IAElD7G,GAAOiG,YAAYW,EAAYC,GAE/BrnB,KAAKmjB,UAAUoB,cAAc,GAE7BvkB,KAAKmjB,UAAUxB,QAAQyF,EAAYC,GAAa,GAEhD,IACII,EADY9S,SAASC,cAAc,UAChBC,WAAW,MAElC4S,EAAO/S,OAAOiB,MAASuR,EACvBO,EAAO/S,OAAO8B,OAAS2Q,EAEvB3F,GAActN,QAAQmR,OAAS7E,GAAOlE,aACtCkF,GAActN,QAAQqR,eACtB/D,GAActN,QAAQsR,mBAAkB,GAExC,IAAK,IAAIzd,EAAI,EAAGA,EAAIuf,EAAavf,IAE/B,IAAK,IAAIkG,EAAI,EAAGA,EAAIuZ,EAAavZ,IAE/BuT,GAActN,QAAQwT,cAAcR,EAAuBC,EACzD3G,GAAO7K,MAAQ5N,EAAWyY,GAAOhK,OAASvI,EAC1CuS,GAAO7K,MAAkB6K,GAAOhK,QAClCxW,KAAKsjB,oBAAoB5B,SAEzB+F,EAAOE,UAAU3nB,KAAKmjB,UAAUuB,WAAYlE,GAAO7K,MAAQ5N,EAAGyY,GAAOhK,OAASvI,GAMlFwZ,EAAO/S,OAAOkT,OAAOb,EAAe,qBAEpCvF,GAActN,QAAQ2T,kBAEtBrH,GAAOiG,YAAYO,EAAWC,GAC9BjnB,KAAKmjB,UAAUoB,cAAcC,GAAchN,KAC3CxX,KAAKmjB,UAAUxB,QAAQqF,EAAWC,GAAY,GAE9CzF,GAActN,QAAQmR,OAAS7E,GAAOlE,aACtCkF,GAActN,QAAQqR,eACtB/D,GAActN,QAAQsR,mBAAkB,GAG1CzlB,oBAAoB+nB,GAElB,IAAIC,EAAOpT,SAASC,cAAc,KAClCmT,EAAKC,SAAW,eAEhBD,EAAKE,KAAOC,IAAIC,gBAAgBL,GAChCC,EAAKK,QAELL,EAAKM,QAAU,WAEbC,uBAAsB,WAEpBJ,IAAIK,gBAAgBR,EAAKE,SAE3BF,EAAKS,gBAAgB,SAIzBzoB,UAEEC,KAAKmjB,UAAU/I,UACfpa,KAAKsjB,oBAAoBlJ,UACzBpa,KAAKojB,QAAQhJ,YCpTF,MAAMqO,WAAuB9W,EAE1C5R,cAEEgJ,MAAM,CACJ+I,SAAU,GAEVC,kLACAE,yHCPS,MAAMyW,WAA2BlX,GAE9CzR,cAEEgJ,QAGFhJ,SAEE4oB,GAASrH,WAAM1a,EAAW4a,GAActN,SAAS,GAAM,GAEvDyU,GAASjH,OAAOlE,GAAatJ,QAASsN,GAActN,aAAStN,EAAW,IAAI6hB,KCGhF,OAAe,IAlBf,cAAoBG,GAElB7oB,cAEEgJ,QAEA/I,KAAK6oB,2BAA4B,EACjC7oB,KAAK8oB,aAAe,CAAE/gB,EAAG,EAAGkG,EAAG,GAGjClO,QAEEgJ,MAAMuY,QAENthB,KAAK6oB,2BAA4B,ICArC,OAAe,IAdf,MAEE9oB,OAEEC,KAAK+oB,qBAAkBniB,EACvB5G,KAAKgpB,gBAAkB,IAAIpQ,EAG7B7Y,oBAAoBoa,GAElBna,KAAK+oB,gBAAkB5O,ICJZ,MAAM8O,GAEnBlpB,YAAYoa,EAAU+O,GAEpBlpB,KAAKma,SAAWA,EAEhBna,KAAKqa,cAAWzT,EAChB5G,KAAK8R,SAAW,GAChB9R,KAAKkpB,YAAcA,EAEnBlpB,KAAKmpB,cAAgB,GAErBnpB,KAAKopB,kBAAexiB,EAEpB5G,KAAKqpB,YAAc,IAAItb,EACvB/N,KAAKspB,aAAe,IAAIvb,EAExB/N,KAAKupB,oBAAsB,EAE3BvpB,KAAKwpB,wBAA0B,EAGjCzpB,KAAKqpB,EAAc9V,EAAaD,GAE9BrT,KAAKqa,SAAW,IAAI1I,EAAe,CACjCG,SAAU9R,KAAK8R,SACfC,aAAcuB,EACdrB,eAAgBoB,IAElBrT,KAAKopB,aAAeA,EAGtBrpB,mBAAmBiH,EAAMjC,GAEvB/E,KAAK8R,SAAS9K,GAAQ,CAAEtC,MAAOK,GAC/B/E,KAAKqa,SAAS9D,aAAc,EAG9BxW,mBAAmBiH,EAAMjC,GAEvB/E,KAAK8R,SAAS9K,GAAMtC,MAAQK,EAG9BhF,sBAAsB0pB,EAAcC,GAElC,IAAIC,EAAgB3pB,KAAK4pB,qBAAqB5pB,KAAKkpB,aAC/CW,EAAgB7pB,KAAK4pB,qBAAqB5pB,KAAKkpB,aAC/CY,EAAgB9pB,KAAK4pB,qBAAqB,GAE1CG,EAAe/pB,KAAKgqB,mBAAmBP,EAAcE,EAASE,EAASC,GAEvEJ,GAEF1pB,KAAKiqB,yBAAyBF,EAAcL,GAIhD3pB,sBAAsB0pB,EAAcS,GAElC,IAAIP,EAAgB3pB,KAAKmqB,sBAAsBnqB,KAAKkpB,aAChDW,EAAgB7pB,KAAKmqB,sBAAsBnqB,KAAKkpB,aAChDY,EAAgB9pB,KAAKmqB,sBAAsB,GAE3CJ,EAAe/pB,KAAKgqB,mBAAmBP,EAAcE,EAASE,EAASC,GAEvEI,GAEFlqB,KAAKoqB,0BAA0BL,EAAcG,GAIjDnqB,4BAA4B0pB,EAAcS,GAExC,IAAIP,EAAgB3pB,KAAKqqB,4BAA4BrqB,KAAKkpB,aACtDW,EAAgB7pB,KAAKqqB,4BAA4BrqB,KAAKkpB,aACtDY,EAAgB9pB,KAAKqqB,4BAA4B,GAEjDN,EAAe/pB,KAAKgqB,mBAAmBP,EAAcE,EAASE,EAASC,GAEvEI,GAEFlqB,KAAKoqB,0BAA0BL,EAAcG,GAIjDnqB,sBAAsBuqB,EAAab,EAAcc,EAASC,EAAOC,EAAOC,GAEtE,IAAIC,EAAY3qB,KAAK4qB,mBAAmBN,GACpCO,EAAe7qB,KAAK8qB,mBAAmBrB,GAE3CzpB,KAAK+qB,gBAAgBF,EAAa1I,IAAKwI,EAAWJ,EAASC,EAAOC,EAAOC,GACzE1qB,KAAK+qB,gBAAgBF,EAAaG,UAAW,EAAGT,EAASC,EAAOC,EAAOC,GAEvEG,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfnrB,sBAAsBuqB,EAAab,EAAc0B,EAASX,EAAOC,EAAOC,EAAOU,GAE7E,IAAIT,EAAY3qB,KAAK4qB,mBAAmBN,GACpCO,EAAe7qB,KAAK8qB,mBAAmBrB,GAE3CzpB,KAAKqrB,iBAAiBR,EAAa1I,IAAKwI,EAAWQ,EAASX,EAAOC,EAAOC,EAAOU,GACjFprB,KAAKqrB,iBAAiBR,EAAaG,UAAW,EAAGG,EAASX,EAAOC,EAAOC,EAAOU,GAC/EP,EAAaI,oBAAsBN,EAEnCE,EAAaK,cAGfnrB,oBAAoB0R,EAAU6Z,GAE5B,IAAK,IAAI1lB,EAAI,EAAGA,EAAI5F,KAAKmpB,cAAcvkB,OAAQgB,IAEzC0lB,EAAgB,GAAKtrB,KAAKmpB,cAAcvjB,GAAGslB,YAAc,IAEjB,IAAtClrB,KAAKmpB,cAAcvjB,GAAGslB,aAExBlrB,KAAKurB,8BAA8B9Z,EAAUzR,KAAKmpB,cAAcvjB,IAE9D5F,KAAKmpB,cAAcvjB,GAAGslB,YAAc,GAEtClrB,KAAKwrB,2BAA2B/Z,EAAUzR,KAAKmpB,cAAcvjB,IAG/D5F,KAAKmpB,cAAcvjB,GAAGslB,YAAc,EAEpCI,KAKNvrB,0BAEEC,KAAKupB,oBAAsB,EAC3B,IAAK,IAAI3jB,EAAI,EAAGA,EAAI5F,KAAKmpB,cAAcvkB,OAAQgB,IAEzC5F,KAAKmpB,cAAcvjB,GAAGslB,YAAc,GAEtClrB,KAAKupB,sBAGT,OAAOvpB,KAAKupB,oBAGdxpB,2BAA2B0R,EAAUga,GAGnCA,EAAarJ,IAAI7L,aAAc,EAC/B9E,EAASia,qBACP1rB,KAAKqpB,YACLoC,EAAatJ,IACbsJ,EAAarJ,KAIjBriB,8BAA8B0R,EAAUga,GAGtC,IAAIE,EAAQF,EAAaR,qBACV,IAAXU,IAKJ3rB,KAAKspB,aAAarb,EAAInH,KAAK8kB,MAAMD,EAAQ3rB,KAAKkpB,aAC9ClpB,KAAKspB,aAAavhB,EAAI4jB,EAAQ3rB,KAAKkpB,YAAclpB,KAAKspB,aAAarb,EACnEwD,EAASia,qBACP1rB,KAAKspB,aACLmC,EAAaT,UACbS,EAAarJ,MAIjBriB,WAEE,OAAO,IAAIya,EAAKxa,KAAKma,SAAUna,KAAKqa,UAGtCta,gBAAgB8qB,EAAcc,EAAOpB,EAASC,EAAOC,EAAOC,GAEtDF,IAEFK,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKpB,EAAQxiB,GAE/C0iB,IAEFI,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKpB,EAAQtc,GAE/Cyc,IAEFG,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKpB,EAAQ5P,GAIrD5a,iBAAiB8qB,EAAcc,EAAOR,EAASX,EAAOC,EAAOC,EAAOU,GAE9DZ,IAEFK,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKR,EAAQpjB,GAE/C0iB,IAEFI,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKR,EAAQld,GAE/Cyc,IAEFG,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKR,EAAQxQ,GAE/CyQ,IAEFP,EAAa/N,MAAM/X,KAAa,EAAR4mB,EAAY,GAAKR,EAAQ3O,GAIrDzc,yBAAyB8qB,EAAcgB,GAErC,IAAK,IAAIjmB,EAAI,EAAGA,EAAI5F,KAAKkpB,YAAclpB,KAAKkpB,YAAatjB,IAEvD5F,KAAK+qB,gBAAgBF,EAAa1I,IAAKvc,EAAGimB,GAAI,GAAM,GAAM,GAC1DhB,EAAaK,cAIjBnrB,0BAA0B8qB,EAAciB,GAEtC,IAAK,IAAIlmB,EAAI,EAAGA,EAAI5F,KAAKkpB,YAAclpB,KAAKkpB,YAAatjB,IAEvD5F,KAAKqrB,iBAAiBR,EAAa1I,IAAKvc,EAAGkmB,GAAI,GAAM,GAAM,GAAM,GACjEjB,EAAaK,cAIjBnrB,qBAAqB4V,GAEnB,IAAI5Q,EAAO,IAAIgnB,WAAW,EAAIpW,EAAQA,GACtC,OAAO,IAAIqW,EAAYjnB,EAAM4Q,EAAOA,EAAOsW,GAG7ClsB,sBAAsB4V,GAEpB,IAAI5Q,EAAO,IAAIgnB,WAAW,EAAIpW,EAAQA,GACtC,OAAO,IAAIqW,EAAYjnB,EAAM4Q,EAAOA,EAAOuW,GAG7CnsB,4BAA4B4V,GAE1B,IAAI5Q,EAAO,IAAIonB,aAAa,EAAIxW,EAAQA,GACxC,OAAO,IAAIqW,EAAYjnB,EAAM4Q,EAAOA,EAAOuW,EAAYE,GAGzDrsB,mBAAmB0pB,GAEjB,IAAK,IAAI7jB,EAAI,EAAGA,EAAI5F,KAAKmpB,cAAcvkB,OAAQgB,IAE7C,GAAI5F,KAAKmpB,cAAcvjB,GAAGoB,OAASyiB,EAEjC,OAAOzpB,KAAKmpB,cAAcvjB,GAG9B5C,QAAQG,MAAM,gBAAkBsmB,EAAe,mBAIjD1pB,mBAAmBiH,GAEjB,IAAK,IAAIpB,EAAI,EAAGA,EAAI5F,KAAKopB,aAAaxkB,OAAQgB,IAE5C,GAAI5F,KAAKopB,aAAaxjB,KAAOoB,EAE3B,OAAOpB,EAGX5C,QAAQG,MAAM,YAAc6D,EAAO,mCAIrCjH,mBAAmB0pB,EAAcpH,EAAagK,EAAaC,GAczD,OAZAD,EAAY9V,aAAc,EAE1BvW,KAAKmpB,cAAc9iB,KAAK,CACtBW,KAAMyiB,EACNtH,IAAKE,EACLD,IAAKiK,EACLrB,UAAWsB,EACXrB,qBAAsB,EACtBC,YAAa,IAGflrB,KAAK8R,SAAS2X,GAAgB,CAAE/kB,MAAO2nB,GAChCrsB,KAAKmpB,cAAcnpB,KAAKmpB,cAAcvkB,OAAS,GAGxD7E,UAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKmpB,cAAcvkB,OAAQgB,IAE7C5F,KAAKmpB,cAAcvjB,GAAGuc,IAAI/H,UAC1Bpa,KAAKmpB,cAAcvjB,GAAGwc,IAAIhI,UAC1Bpa,KAAKmpB,cAAcvjB,GAAGolB,UAAU5Q,WCvPtC,OAAe,IAvDf,MAEEra,OAEEC,KAAKusB,QAAU,GAGjBxsB,MAAMysB,GAEJ,IAAIC,EAAoB,GACpBC,EAAgBzmB,EAAM0mB,eAAe7lB,KAAKqB,KAAKqkB,EAAkB5nB,SAGrE5E,KAAK4sB,gBAAgBH,EAAmBC,GAExC,IAAIG,EAAW,EAEf,IAAK,IAAIjnB,EAAI,EAAGA,EAAI4mB,EAAkB5nB,OAAQgB,IAC9C,CACE,IAAIknB,EAAeN,EAAkB5mB,GAAG+G,aAAa,YAAYogB,MAC7D9e,EAAInH,KAAK8kB,MAAMhmB,EAAI8mB,GACnB3kB,EAAInC,EAAI8mB,EAAgBze,EAC5B,IAAK,IAAI8e,EAAQ,EAAGA,EAAQD,EAAcC,IAExCN,EAAkBI,GAAa9kB,EAAI2kB,EAAiB,GAAMA,EAC1DD,EAAkBI,EAAW,GAAM5e,EAAIye,EAAiB,GAAMA,EAC9DG,GAAY,EAIhB,IAAIG,EAAmB,IAAIC,EAAgB,IAAId,aAAaM,GAAoB,GAC5EjR,EAAkBC,GAAoBC,sBAAsB8Q,GAIhE,OAHAhR,EAAgBpG,aAAa,mBAAoB4X,GAEjDhtB,KAAKusB,QAAQlmB,KAAK,IAAI4iB,GAAczN,EAAiBkR,IAC9C1sB,KAAKusB,QAAQvsB,KAAKusB,QAAQ3nB,OAAS,GAG5C7E,oBAAoB0R,GAElB,IAAK,IAAI7L,EAAI,EAAGA,EAAI5F,KAAKusB,QAAQ3nB,OAAQgB,IAEvC5F,KAAKusB,QAAQ3mB,GAAGsnB,oBAAoBzb,EAAU,GAIlD1R,gBAAgBotB,EAAKT,GAEnB,IAAK,IAAI9mB,EAAI,EAAGA,EAAI8mB,EAAgBA,EAAgB,EAAG9mB,IAErDunB,EAAI9mB,KAAK,KCiCf,OAAe,IAjFf,MAEEtG,OAEEC,KAAKotB,YAAc,GACnBptB,KAAKqtB,oBAAsB,IAAItf,EAC/B/N,KAAKstB,SAAW,IAAIvT,EACpB/Z,KAAKstB,SAASC,YAAa,EAC3BvtB,KAAKstB,SAASnP,eAAgB,EAE9Bne,KAAKwtB,SAAW,IAAIzT,EACpB/Z,KAAKwtB,SAASD,YAAa,EAC3BvtB,KAAKwtB,SAASrP,eAAgB,EAE9Bne,KAAKytB,UAAY,IAAIvL,GAAoB,EAAG,EAAG,GAAI,GAAI,IAAK,KAG9DniB,eAAe2tB,GAEb,IAAI/B,EAAQ3rB,KAAKotB,YAAYxsB,QAAQ8sB,GACjC/B,GAAS,GAEX3rB,KAAKotB,YAAYO,OAAOhC,EAAO,GAGjC3rB,KAAKstB,SAASlc,OAAOsc,GACrB1tB,KAAKwtB,SAASpc,OAAOsc,GAErBA,EAAKtT,UAGPra,yBAAyB2tB,GAEvB1tB,KAAKotB,YAAY/mB,KAAKqnB,GACtB1tB,KAAKstB,SAASnc,IAAIuc,GAElBA,EAAKE,qCAGP7tB,wBAAwB2tB,GAEtB1tB,KAAKotB,YAAY/mB,KAAKqnB,GACtB1tB,KAAKwtB,SAASrc,IAAIuc,GAElBA,EAAKG,oCAGP9tB,SAMEC,KAAKytB,UAAUnI,yBAEftlB,KAAKqtB,oBAAoB9P,KAAKuQ,GAAMC,KACpC,IAAK,IAAInoB,EAAI,EAAGA,EAAI5F,KAAKotB,YAAYxoB,OAAQgB,IAE3C5F,KAAKotB,YAAYxnB,GAAGooB,aAAahuB,KAAKqtB,qBAI1CttB,OAAO0R,GAGDzR,KAAKstB,SAAShT,SAAS1V,OAAS,GAElC+jB,GAASjH,OAAO1hB,KAAKstB,SAAUttB,KAAKytB,WAElCztB,KAAKwtB,SAASlT,SAAS1V,OAAS,GAElC+jB,GAASjH,OAAO1hB,KAAKwtB,SAAUhM,GAActN,SAIjDnU,QAEEC,KAAKiuB,6BAA0BrnB,IClFpB,MAAMsnB,GAEnBnuB,eAGAA,kBAAkB2E,EAChB6C,EACAC,EACA2mB,EACAC,GAEA,OAAS1pB,EAAQ6C,IAA2BC,EAAuBD,IAA4B6mB,EAAqBD,GAAwBA,EAG9IpuB,eAAe2E,EAAOmD,EAAKd,GAEzB,OAAQrC,GAASmD,GAAOnD,GAASqC,EAGnChH,WAAWsuB,EAAQC,GAEjB,OAASD,EAASC,EAAWA,GAAWA,EAG1CvuB,kBAAkBwuB,GAmBhB,OAjBAA,EAAIC,EAAI1nB,KAAK2nB,MAAc,IAARF,EAAIC,GAASE,SAAS,IACzCH,EAAII,EAAI7nB,KAAK2nB,MAAc,IAARF,EAAII,GAASD,SAAS,IACzCH,EAAIlhB,EAAIvG,KAAK2nB,MAAc,IAARF,EAAIlhB,GAASqhB,SAAS,IAEpB,IAAjBH,EAAIC,EAAE5pB,SAER2pB,EAAIC,EAAI,IAAMD,EAAIC,GAEC,IAAjBD,EAAII,EAAE/pB,SAER2pB,EAAII,EAAI,IAAMJ,EAAII,GAEC,IAAjBJ,EAAIlhB,EAAEzI,SAER2pB,EAAIlhB,EAAI,IAAMkhB,EAAIlhB,GAGb,IAAMkhB,EAAIC,EAAID,EAAII,EAAIJ,EAAIlhB,EAGnCtN,+BAA+Bke,EAAQe,GAErC,IAAI4P,EAAkB,IAAIhW,EACtBiW,EAAkB,GACtB,IAAK,IAAIjpB,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IAEjCoZ,EAAM8P,aAAa7Q,EAAOrY,GAAIgpB,GAC9BC,EAAgBxoB,KAAKuoB,EAAgBvR,SAGvC,OAAOwR,EAGT9uB,oBAAoBuG,EAAMC,EAAIwoB,EAAQtmB,GAEpC,IAAK,IAAI7C,EAAI,EAAGA,EAAI,GAAIA,IAEtBmpB,EAAOC,SAASppB,GAAKK,EAAM+C,KAAK1C,EAAK0oB,SAASppB,GAAIW,EAAGyoB,SAASppB,GAAI6C,GAItE1I,cAAckvB,EAAIC,GAEhB,OAAOpoB,KAAKgB,IAAImnB,EAAKC,GAAM,KAG7BnvB,0BAA0BmQ,GAKxB,OAHAA,EAAEnI,GAAKmI,EAAEsM,EACTtM,EAAEjC,GAAKiC,EAAEsM,EACTtM,EAAEyK,GAAKzK,EAAEsM,EACFtM,EAGTnQ,sBAAsBke,GAEpB,IAAIO,EAASP,EAAO,GAAGZ,QACvB,IAAK,IAAIzX,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IAEjC4Y,EAAOrN,IAAI8M,EAAOrY,IAGpB,OADA4Y,EAAOnC,eAAe,EAAI4B,EAAOrZ,QAC1B4Z,EAGTze,0BAEE,IAAIovB,EAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,KAE9DC,EAAM,IASV,OARAA,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WAC3BD,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WAE3BD,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WAC3BD,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WAE3BD,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WAC3BD,GAAOD,EAAIroB,KAAK8kB,MAAsB,GAAhB9kB,KAAKuoB,WACpBD,GCyFX,OAAe,IAxLf,MAEErvB,OAEEC,KAAKsvB,QAAU,IAAIC,EACnBvvB,KAAKwvB,QAAU,IAAI5W,EAAQ,EAAG,EAAG,GACjC5Y,KAAKyvB,SAAW,IAAI7W,EAAQ,EAAG,EAAG,GAClC5Y,KAAKgf,MAAQ,IAAI0Q,EACjB1vB,KAAK2vB,IAAM,IAAIC,EAEf5vB,KAAK6vB,SAAW,IAAIjX,EACpB5Y,KAAK8vB,WAAa,IAAIlX,EAGxB7Y,WAAWoU,GAMT,OAJAA,EAASA,GAAUqN,GAActN,QACjClU,KAAKwvB,QAAQ1V,IAAI,EAAG,EAAG,GACvB9Z,KAAKwvB,QAAQO,gBAAgB5b,EAAOyH,YAE7B5b,KAAKwvB,QAGdzvB,gBAAgBoU,GAMd,OAJAA,EAASA,GAAUqN,GAActN,QACjClU,KAAKwvB,QAAQ1V,IAAI,EAAG,GAAI,GACxB9Z,KAAKwvB,QAAQO,gBAAgB5b,EAAOyH,YAE7B5b,KAAKwvB,QAGdzvB,cAAcoU,GAKZ,OAHAA,EAASA,GAAUqN,GAActN,QACjClU,KAAKwvB,QAAQ1V,IAAI,EAAG,EAAG,GACvB9Z,KAAKwvB,QAAQO,gBAAgB5b,EAAOyH,YAC7B5b,KAAKwvB,QAGdzvB,yBAAyBguB,EAAK5Z,GAG5B,IAAI6b,GADJ7b,EAASA,GAAUqN,GAActN,SACb+b,IAAM,EAAKnpB,KAAKuB,GAAK,IACrC6nB,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS7b,EAAOkR,QAAW,EAE3DgL,EAAQvpB,KAAKspB,IAAIJ,GAAS7b,EAAOsN,IACjC6O,EAAQxpB,KAAKspB,IAAIF,GAAS/b,EAAOsN,IAIrC,OAFAzhB,KAAKwvB,QAAQ1V,IAAIwW,EAAQvC,EAAIhmB,EAAGsoB,EAAQtC,EAAI9f,GAAIkG,EAAOsN,KAAKnE,YAErDtd,KAAKwvB,QAAQO,gBAAgB5b,EAAOyH,YAG7C7b,uBAAuBwwB,EAAgBC,EAAczC,EAAK5Z,GAiBxD,OAfAA,EAASA,GAAUqN,GAActN,QACjC6Z,EAAMA,GAAOD,GAAMC,IAEnB/tB,KAAKgf,MAAMyR,8BAA8BD,GAAgBxwB,KAAK0wB,gBAAgBvc,GAASoc,GACnFpc,EAAOwc,oBAET3wB,KAAK2vB,IAAI7V,IAAI3F,EAAO4H,SAAU/b,KAAK4wB,yBAAyB7C,EAAK5Z,KAIjEnU,KAAK8vB,WAAWhW,IAAIiU,EAAIhmB,EAAGgmB,EAAI9f,EAAG,GAAG4iB,UAAU1c,GAC/CnU,KAAK2vB,IAAI7V,IAAI3F,EAAO4H,SAAU/b,KAAK8vB,aAGrC9vB,KAAK2vB,IAAImB,eAAe9wB,KAAKgf,MAAOhf,KAAKyvB,UAClCzvB,KAAKyvB,SAGd1vB,qBAAqBke,EAAQ8S,EAAa,GAExC,IACIC,GADgB,IAAInW,GAAS3B,cAAc+E,GACRO,OACnCyS,EAAiBjxB,KAAK0wB,gBAAgBlP,GAActN,SAASmJ,QAE7D2B,GAAQ,IAAI0Q,GAAQe,8BAA8BQ,EAAgBD,GAElEnC,EAAkBX,GAAcgD,wBAAwBjT,EAAQe,GAEhEmS,EAA0B,IAAIvY,EAC9BqG,GAAO,IAAIC,GAAOhG,cAAc2V,GACpC5P,EAAImS,UAAUD,GAEd,IAAIE,EAAK,IAAIzY,EAAQ,EAAG,EAAG,GAAGmX,gBAAgBvO,GAActN,QAAQ0H,YAChE0V,EAAQD,EAAGhU,QAAQkU,MAAMN,GAAgB3T,YACzCsF,GAAM,IAAI2M,GAAUzV,IAAIwX,EAAMvpB,EAAGspB,EAAGtpB,EAAGkpB,EAAelpB,EAAGipB,EAAmBjpB,EAC9EupB,EAAMrjB,EAAGojB,EAAGpjB,EAAGgjB,EAAehjB,EAAG+iB,EAAmB/iB,EACpDqjB,EAAM3W,EAAG0W,EAAG1W,EAAGsW,EAAetW,EAAGqW,EAAmBrW,EACpD,EAAM,EAAkB,EAAU,GAEhC6W,GAAc,IAAIjC,GAAUkC,WAAW7O,GAC3C,IAAK,IAAIhd,EAAI,EAAGA,EAAIipB,EAAgBjqB,OAAQgB,IAE1CipB,EAAgBjpB,GAAG8rB,aAAaF,GAGlC,IAAIjvB,EAAO,IAAIqW,EACfqG,GAAO,IAAIC,GAAOhG,cAAc2V,GAChC5P,EAAIyD,QAAQngB,GACZA,EAAK8Z,eAAe0U,GACpB,IAAIY,EAAmB,IAAI/Y,EAG3B,OAFAqG,EAAImS,UAAUO,GAEP,CACL5V,SAAUoV,EACV9lB,KAAMrL,KAAK4xB,qBAAqBrvB,EAAKwF,EAAI,EAAGxF,EAAK0L,EAAI,IAIzDlO,qBAAqB4V,EAAOa,GAE1B,IAAIwZ,EAASxO,GAActN,QAAQ+b,IAAM,EAAKnpB,KAAKuB,GAAK,IACpD6nB,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAASxO,GAActN,QAAQmR,QAAW,EAE1EgL,EAAQ7Z,EAAS1P,KAAKspB,IAAIJ,GAC1BM,EAAQ3a,EAAQ7O,KAAKspB,IAAIF,GAE7B,OAAOppB,KAAKC,IAAID,KAAKgB,IAAIwoB,GAAQxpB,KAAKgB,IAAIuoB,IAG5CtwB,oBAAoBkgB,EAAI9L,GAEtB,GAAIA,EAAO0d,qBACX,CACE5R,EAAGyC,QAAQ1iB,KAAK6vB,UAEhB,IAAIiC,EAAQ9xB,KAAK6vB,SAAS9nB,EACtBgqB,EAAQ/xB,KAAK6vB,SAAS5hB,EACtB+jB,EAAgBF,EAAQC,EAC5B,OAAIvR,GAAOlE,aAAe0V,EAAgB,EAEjCxR,GAAOhK,OAASub,EAIhBvR,GAAO7K,MAAQmc,EAI1B,CAEE,IAAIvvB,EAAO,IAAIqW,EAEf,OADAqH,EAAGyC,QAAQngB,GACJvC,KAAK4xB,qBAAqBrvB,EAAKwF,EAAGxF,EAAK0L,IAIlDlO,oBAAoBkyB,EAAQ9d,GAO1B,OALA8d,EAAOC,iBAAiBlyB,KAAKwvB,SAC7BxvB,KAAKwvB,QAAQ2C,QAAQhe,GAErBnU,KAAKwvB,QAAQznB,GAAsB,GAAjB/H,KAAKwvB,QAAQznB,EAAU,IAAQyY,GAAY,MAC7DxgB,KAAKwvB,QAAQvhB,GAAK,GAAsB,GAAjBjO,KAAKwvB,QAAQvhB,EAAU,KAAQuS,GAAOhK,OACtDxW,KAAKwvB,QAGdzvB,oBAAoBqe,EAAKjK,GAQvB,OANAA,EAASA,GAAUqN,GAActN,QACjClU,KAAKwvB,QAAQjS,KAAKa,GAClBpe,KAAKwvB,QAAQ2C,QAAQhe,GAErBnU,KAAKwvB,QAAQznB,GAAsB,GAAjB/H,KAAKwvB,QAAQznB,EAAU,IAAQyY,GAAY,MAC7DxgB,KAAKwvB,QAAQvhB,GAAK,GAAsB,GAAjBjO,KAAKwvB,QAAQvhB,EAAU,KAAQuS,GAAOhK,OACtDxW,KAAKwvB,QAGdzvB,kBAAkBoU,GAEhBA,EAAOie,MAAU5R,GAAO7K,MAAQ,EAChCxB,EAAOmd,MAAS9Q,GAAO7K,MAAQ,EAC/BxB,EAAOke,IAAS7R,GAAOhK,OAAS,EAChCrC,EAAOme,QAAU9R,GAAOhK,OAAS,EACjCrC,EAAOkR,OAAS7E,GAAOlE,aACvBnI,EAAOmR,wBAAuB,KC1IlC,OAAe,IArCf,MAEEvlB,eAIAA,KAAK2U,EAAQ6d,EAAetP,GAE1BzB,GAAcgR,OACdC,GAAgBD,OAChB7N,GAAa6N,OACbhO,GAAcgO,OACdxmB,GAAawmB,OACbE,GAAgBF,OAChB1E,GAAM0E,KAAKD,GACXjvB,GAAGkvB,OACHG,GAAuBH,OACvBzhB,GAAkByhB,OAClBhV,GAAagV,OACbhS,GAAOgS,OACPnjB,GAAKmjB,OACLI,GAAGJ,OAEH7J,GAAS6J,KAAK9d,EAAQuO,GACtB4P,GAAML,OAGRzyB,QAAQ+yB,GAENnK,GAASvO,UACT0T,GAAM1T,UACNoD,GAAapD,UAEb0Y,EAAY1Y,YC9CD,MAAM2Y,WAAmB3wB,GAEtCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GAExBvC,KAAKsS,OAAS,IAAI0gB,EAGpBjzB,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMyC,IAE1B3B,EAAmB2P,aAAaL,EAAIrQ,YAAaJ,KAAKC,MAAM6C,IAE5D2N,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,gOCxBK,MAAMigB,WAAqB7f,GAExCrT,cAEEgJ,o2DAAY6I,IAEZ5R,KAAK8R,SAASohB,mBAAqB,CAAExuB,MAAO,IAAI6qB,GAChDvvB,KAAK8R,SAASqhB,kBAAqB,CAAEzuB,MAAO,IAAI6qB,GAEhDvvB,KAAK8R,SAASshB,MAAY,CAAE1uB,MAAO,OACnC1E,KAAK8R,SAASuhB,QAAY,CAAE3uB,MAAO,IACnC1E,KAAK8R,SAASgP,UAAY,CAAEpc,MAAO,KAEnC1E,KAAK8R,SAASwhB,cAAgB,CAAE5uB,MAAO1E,KAAKuzB,uBAC5CvzB,KAAK8R,SAAS0hB,gBAAkB,CAAE9uB,MAAO1E,KAAKyzB,yBAGhD1zB,sBAEE,IAAI2zB,EAAgB,GAGpB,IAAK,IAAI9tB,EAAI,EAAGA,EAFE,GAEeA,IACjC,CACE,IAAIoV,EAAM,IAAIpC,EAAwB,EAAhB9R,KAAKuoB,SAAe,EACxB,EAAhBvoB,KAAKuoB,SAAe,EACpBvoB,KAAKuoB,UACPrU,EAAIsC,YACJ,IAAI5E,EAAQ9S,EARI,GAShB8S,EAAUzS,EAAM+C,KAAK,GAAK,EAAK0P,EAAQA,GACvCsC,EAAIqB,eAAe3D,GAEnBgb,EAAcrtB,KAAK2U,GAErB,OAAO0Y,EAGT3zB,wBAEE,IAAI4zB,EAAkB,IAAI5H,WAAW,IACrC,IAAK,IAAInmB,EAAI,EAAGA,EAAI,GAAIA,IAEtB+tB,EAAoB,EAAJ/tB,EAAQ,GAAKkB,KAAK8kB,MAAsB,IAAhB9kB,KAAKuoB,UAC7CsE,EAAoB,EAAJ/tB,EAAQ,GAAKkB,KAAK8kB,MAAsB,IAAhB9kB,KAAKuoB,UAC7CsE,EAAoB,EAAJ/tB,EAAQ,GAAK,EAG/B,IAAIguB,EAAmB,IAAI5H,EAAY2H,EAAiB,EAAG,EAAG1H,GAK9D,OAJA2H,EAAiBC,MAAQC,EACzBF,EAAiBG,MAAQD,EAEzBF,EAAiBrd,aAAc,EACxBqd,GC5DI,MAAMI,WAA4B5gB,GAE/CrT,cAEEgJ,wPACA/I,KAAK8R,SAASmiB,IAAM,CAAEvvB,WAAOkC,ICFlB,MAAMstB,WAAqC9gB,GAExDrT,cAEEgJ,i5BAAYorB,IACZn0B,KAAK8R,SAASgP,UAAqB,CAAEpc,MAAO,GAC5C1E,KAAK8R,SAASohB,mBAAqB,CAAExuB,MAAO,IAAI6qB,ICPrC,MAAM6E,WAAwBhhB,GAE3CrT,cAEEgJ,6sBACA/I,KAAK8R,SAASuiB,WAAa,CAAE3vB,MAAO,IAAIqJ,ICL7B,MAAMumB,GAEnBv0B,YAAY0R,GAEVzR,KAAKu0B,IAAM,IAAItT,EAAkB,EAAG,GACpCjhB,KAAKw0B,IAAM,IAAIvT,EAAkB,EAAG,GACpCjhB,KAAKy0B,aAAe,IAAIL,GAG1Br0B,KAAK2d,GAECA,EAAG/H,QAAU3V,KAAKu0B,IAAI5e,OAAS+H,EAAGlH,SAAWxW,KAAKu0B,IAAI/d,SAExDxW,KAAKu0B,IAAI5S,QAAQjE,EAAG/H,MAAO+H,EAAGlH,QAC9BxW,KAAKw0B,IAAI7S,QAAQjE,EAAG/H,MAAO+H,EAAGlH,SAGhCxW,KAAKy0B,aAAa3iB,SAASuiB,WAAW3vB,MAAMoV,IAAI,EAAG,GACnD6O,GAAS7B,KAAKpJ,EAAI1d,KAAKu0B,IAAKv0B,KAAKy0B,cACjCz0B,KAAKy0B,aAAa3iB,SAASuiB,WAAW3vB,MAAMoV,IAAI,EAAG,GACnD6O,GAAS7B,KAAK9mB,KAAKu0B,IAAK7W,EAAI1d,KAAKy0B,eCZtB,MAAMC,WAAuBljB,GAE1CzR,cAEEgJ,QAEA/I,KAAK20B,SAAW,IAAI1B,GACpBjzB,KAAK40B,iBAAmB,IAAIZ,GAC5Bh0B,KAAK60B,cAAgB,IAAIX,GAEzBl0B,KAAK80B,KAAOtQ,GAAcuQ,SAAW,EAAI,EAEzC/0B,KAAKg1B,QAAU,IAAI/T,EAAkBT,GAAO7K,MAAQ3V,KAAK80B,KAAMtU,GAAOhK,OAASxW,KAAK80B,MAEpF90B,KAAKi1B,QAAU,IAAIhU,EAAkBT,GAAO7K,MAAO6K,GAAOhK,QAE1DxW,KAAKk1B,QAAU,IAAIZ,GACnB3L,GAASpF,4BAA6B,EAGxCxjB,SAEEC,KAAKm1B,kBAELxM,GAASrH,MAAMthB,KAAKg1B,QAASxT,GAActN,SAAS,GAAM,GAC1DyU,GAASjH,OAAOlE,GAAatJ,QAASsN,GAActN,QAASlU,KAAKg1B,SAElEh1B,KAAKo1B,oBAELzM,GAAS7B,KAAK6B,GAAS1D,iBAAkBjlB,KAAKi1B,QAASj1B,KAAK20B,UAG5D30B,KAAKk1B,QAAQG,KAAKr1B,KAAKi1B,SACvBtM,GAAS7B,KAAK9mB,KAAKi1B,aAASruB,GAG5B5G,KAAK40B,iBAAiB9iB,SAASmiB,IAAIvvB,MAAQ1E,KAAKi1B,QAAQ1S,QACxDoG,GAAS7B,KAAK9mB,KAAKg1B,aAASpuB,EAAW5G,KAAK40B,kBAK9C70B,oBAEEC,KAAK20B,SAAS7iB,SAASohB,mBAAmBxuB,MAAM+sB,WAAWjQ,GAActN,QAAQohB,kBACjFt1B,KAAK20B,SAAS7iB,SAASqhB,kBAAkBzuB,MAAM6Y,KAAKiE,GAActN,QAAQohB,kBAC1Et1B,KAAK20B,SAAS7iB,SAASgP,UAAUpc,MAAQ8c,GAActN,QAAQuN,IAGjE1hB,kBAEMC,KAAKg1B,QAAQrf,QAAU6K,GAAO7K,MAAQ3V,KAAK80B,MAAQ90B,KAAKg1B,QAAQxe,SAAWgK,GAAOhK,OAASxW,KAAK80B,OAElG90B,KAAKg1B,QAAQrT,QAAQnB,GAAO7K,MAAQ3V,KAAK80B,KAAMtU,GAAOhK,OAASxW,KAAK80B,MACpE90B,KAAKi1B,QAAQtT,QAAQnB,GAAO7K,MAAO6K,GAAOhK,UC9DjC,MAAM+e,WAAqB/jB,GAExCzR,cAEEgJ,QAGFhJ,SAEE4oB,GAASrH,WAAM1a,EAAW4a,GAActN,SAAS,GAAM,GAEvDyU,GAASjH,OAAOlE,GAAatJ,QAASsN,GAActN,UCbzC,MAAMshB,WAAmCpiB,GAEtDrT,YAAY01B,GAEV1sB,m7BAAYnC,EAAW,CACrB8uB,SAAUD,IAEZz1B,KAAK8R,SAAS0B,SAAkB,CAAE9O,WAAOkC,GACzC5G,KAAK8R,SAAS6jB,YAAkB,CAAEjxB,WAAOkC,GACzC5G,KAAK8R,SAAS8jB,eAAkB,CAAElxB,MAAO,GAEzC1E,KAAK8R,SAAS+jB,aAAgB,CAAEnxB,MAAO,MACvC1E,KAAK8R,SAASgkB,aAAgB,CAAEpxB,MAAO,MACvC1E,KAAK8R,SAASikB,aAAgB,CAAErxB,MAAO,MACvC1E,KAAK8R,SAASkkB,aAAgB,CAAEtxB,MAAO,MACvC1E,KAAK8R,SAASmkB,aAAgB,CAAEvxB,MAAO,MAEvC1E,KAAK8R,SAASokB,cAAgB,CAAExxB,MAAO,GACvC1E,KAAK8R,SAASqkB,aAAgB,CAAEzxB,MAAO,CAAC,EAAK,GAAK,GAAK,GAAK,KAC5D1E,KAAK8R,SAASskB,YAAgB,CAAE1xB,MAAO,GAEvC,IAAI2xB,EAAkB,CACpB,IAAIjkB,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,WACV,IAAIA,EAAM,YAGZpS,KAAK8R,SAASukB,gBAAkB,CAAE3xB,MAAO2xB,GAG3Ct2B,SAASu2B,GAEPt2B,KAAK8R,SAAS+jB,aAAanxB,MAAQ4xB,EAGrCv2B,SAASu2B,GAEPt2B,KAAK8R,SAASgkB,aAAapxB,MAAQ4xB,EAGrCv2B,SAASu2B,GAEPt2B,KAAK8R,SAASikB,aAAarxB,MAAQ4xB,EAGrCv2B,SAASu2B,GAEPt2B,KAAK8R,SAASkkB,aAAatxB,MAAQ4xB,EAGrCv2B,SAASu2B,GAEPt2B,KAAK8R,SAASmkB,aAAavxB,MAAQ4xB,EAGrCv2B,mBAAmB2E,GAEjB1E,KAAK8R,SAASokB,cAAcxxB,MAAQA,EAGtC3E,iBAAiB2E,GAEf1E,KAAK8R,SAASskB,YAAY1xB,MAAQA,EAGpC3E,iBAAiBw2B,GAEfv2B,KAAK8R,SAASukB,gBAAgB3xB,MAAM,GAAGoV,IAAIyc,GAG7Cx2B,iBAAiBw2B,GAEfv2B,KAAK8R,SAASukB,gBAAgB3xB,MAAM,GAAGoV,IAAIyc,GAG7Cx2B,iBAAiBw2B,GAEfv2B,KAAK8R,SAASukB,gBAAgB3xB,MAAM,GAAGoV,IAAIyc,GAG7Cx2B,iBAAiBw2B,GAEfv2B,KAAK8R,SAASukB,gBAAgB3xB,MAAM,GAAGoV,IAAIyc,GAG7Cx2B,iBAAiBw2B,GAEfv2B,KAAK8R,SAASukB,gBAAgB3xB,MAAM,GAAGoV,IAAIyc,ICzFhC,MAAMC,WAAoBpjB,GAEvCrT,YAAY01B,GAEV1sB,gMAEA/I,KAAK8R,SAAS2kB,WAAa,CAAE/xB,WAAOkC,GAGtC7G,gBAAgB8c,GAEd7c,KAAK8R,SAAS2kB,WAAW/xB,MAAQmY,GCVtB,MAAM6Z,WAA6BtjB,GAEhDrT,YAAY42B,GAEV5tB,6qBAAYnC,EAAW,CACrBgwB,cAAeD,EACfE,MAAOF,IAGT32B,KAAK8R,SAASglB,QAAU,CAAEpyB,MAAO,IAAIqJ,EAAQ,GAAK,KAClD/N,KAAK8R,SAASilB,UAAY,CAAEryB,MAAO,IAAIqJ,EAAQ,GAAK,KAGtDhO,SAASyc,EAAGC,GAEVzc,KAAK8R,SAASglB,QAAQpyB,MAAMqD,EAAIyU,EAChCxc,KAAK8R,SAASglB,QAAQpyB,MAAMuJ,EAAIwO,EAGlC1c,cAAcgI,EAAGkG,GAEfjO,KAAK8R,SAASilB,UAAUryB,MAAMoV,IAAI/R,EAAGkG,ICtB1B,MAAM+oB,WAAmC5jB,GAEtDrT,YAAY42B,GAEV5tB,ydAEA/I,KAAK8R,SAASmlB,oBAAsB,CAAEvyB,MAAO,KAC7C1E,KAAK8R,SAASolB,YAAsB,CAAExyB,MAAO,KAC7C1E,KAAK8R,SAASqlB,aAAsB,CAAEzyB,MAAO,IAAI0N,EAAM,YACvDpS,KAAK8R,SAASslB,eAAsB,CAAE1yB,MAAO,ICNlC,MAAM2yB,GAEnBt3B,YAAY01B,EAAQ,GAElBz1B,KAAKkmB,cAAgB,EACrBlmB,KAAKomB,eAAiB,EAEtBpmB,KAAKs3B,uBAAyB,GAC9Bt3B,KAAKu3B,wBAA0B,GAC/Bv3B,KAAKw3B,sBAAwB,GAE7Bx3B,KAAKy1B,MAAQA,EACbz1B,KAAKy3B,gBAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,IACpCz3B,KAAK03B,QAAU,CAAEC,UAAWC,EAAcC,UAAWD,EAAcE,OAAQ5L,GAE3ElsB,KAAK+3B,mBAAqB,IAAI9W,EAAkB,EAAG,EAAGjhB,KAAK03B,SAC3D13B,KAAK+3B,mBAAmBxV,QAAQyV,iBAAkB,EAElDh4B,KAAKi4B,iBACLj4B,KAAKk4B,UAELl4B,KAAKm4B,yBAA2B,IAAInB,GAGtCj3B,KAAK2d,EAAI0a,GAEPp4B,KAAKq4B,UAAU3a,EAAG/H,MAAO+H,EAAGlH,QAExB4hB,EAEFzP,GAAS7B,KAAKpJ,EAAI1d,KAAK+3B,mBAAoB/3B,KAAKm4B,0BAIhDxP,GAAS7B,KAAKpJ,EAAI1d,KAAK+3B,oBAGzB,IAAIO,EAAoBt4B,KAAK+3B,mBAE7B,IAAK,IAAInyB,EAAI,EAAGA,EAAI5F,KAAKy1B,MAAO7vB,IAChC,CACE,IAAIgd,EAAM5iB,KAAKs3B,uBAAuB1xB,GAEtCgd,EAAI2V,cAAc,EAAG,GACrB5P,GAAS7B,KAAKwR,EAAmBt4B,KAAKu3B,wBAAwB3xB,GAAIgd,GAElEA,EAAI2V,cAAc,EAAG,GACrB5P,GAAS7B,KAAK9mB,KAAKu3B,wBAAwB3xB,GAAI5F,KAAKw3B,sBAAsB5xB,GAAIgd,GAE9E0V,EAAoBt4B,KAAKw3B,sBAAsB5xB,IAInD7F,sBAEE,OAAOC,KAAKu3B,wBAAwB,GAAGhV,QAGzCxiB,iBAEE,OAAOC,KAAKu3B,wBAAwB,GAGtCx3B,UAEEC,KAAKw4B,aAELx4B,KAAK+3B,mBAAmBpW,QAAQ,EAAG,GAEnC,IAAK,IAAI/b,EAAI,EAAGA,EAAI5F,KAAKy1B,MAAO7vB,IAChC,CACE,IAAI6yB,EAAM,IAAIxX,EAAkB,EAAG,EAAGjhB,KAAK03B,SACvCgB,EAAM,IAAIzX,EAAkB,EAAG,EAAGjhB,KAAK03B,SAE3Ce,EAAIlW,QAAQyV,iBAAkB,EAC9BU,EAAInW,QAAQyV,iBAAkB,EAE9Bh4B,KAAKu3B,wBAAwBlxB,KAAKoyB,GAClCz4B,KAAKw3B,sBAAsBnxB,KAAKqyB,IAIpC34B,UAAU2sB,EAAeiM,GAEvB,GAAI34B,KAAKkmB,gBAAkBwG,GAAiB1sB,KAAKomB,iBAAmBuS,EAElE,OAGF34B,KAAKkmB,cAAgBwG,EACrB1sB,KAAKomB,eAAiBuS,EAEtB,IAAIhjB,EAAQ7O,KAAK2nB,MAAM/B,EAAgB,GACnClW,EAAS1P,KAAK2nB,MAAMkK,EAAiB,GAEzC34B,KAAK+3B,mBAAmBpW,QAAQhM,EAAOa,GAEvC,IAAK,IAAI5Q,EAAI,EAAGA,EAAI5F,KAAKy1B,MAAO7vB,IAE9B5F,KAAKw3B,sBAAsB5xB,GAAG+b,QAAQhM,EAAOa,GAC7CxW,KAAKu3B,wBAAwB3xB,GAAG+b,QAAQhM,EAAOa,GAC/CxW,KAAKs3B,uBAAuB1xB,GAAGgzB,SAASjjB,EAAOa,GAE/Cb,EAAU7O,KAAK2nB,MAAM9Y,EAAQ,GAC7Ba,EAAU1P,KAAK2nB,MAAMjY,EAAS,GAIlCzW,eAAe2sB,EAAeiM,GAE5B34B,KAAK64B,oBAEL,IAAK,IAAIjzB,EAAI,EAAGA,EAAI5F,KAAKy1B,MAAO7vB,IAE9B5F,KAAKs3B,uBAAuBjxB,KAAK,IAAIqwB,GAAqB12B,KAAKy3B,gBAAgB7xB,KAInF7F,oBAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKs3B,uBAAuB1yB,OAAQgB,IAEtD5F,KAAKs3B,uBAAuB1xB,GAAGwU,UAEjCpa,KAAKs3B,uBAAuB1yB,OAAS,EAGvC7E,aAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKw3B,sBAAsB5yB,OAAQgB,IAErD5F,KAAKu3B,wBAAwB3xB,GAAGwU,UAChCpa,KAAKw3B,sBAAsB5xB,GAAGwU,UAEhCpa,KAAK+3B,mBAAmB3d,UAExBpa,KAAKu3B,wBAAwB3yB,OAAS,EACtC5E,KAAKw3B,sBAAsB5yB,OAAS,GCnIzB,MAAMk0B,WAA0BtnB,GAE7CzR,cAEEgJ,QAEA/I,KAAK+4B,uBAAoBnyB,EAEzB5G,KAAKg1B,aAAUpuB,EACf5G,KAAKg5B,aAAUpyB,EACf5G,KAAKk1B,aAAUtuB,EAEf5G,KAAKi5B,QAAU,IAAIzC,GAGrBz2B,WAEEC,KAAKk1B,QAAU,IAAImC,GACnBr3B,KAAKg1B,QAAU,IAAI/T,EAAkBT,GAAOxE,aAAcwE,GAAOvE,eACjEjc,KAAKg5B,QAAU,IAAI/X,EAAkBT,GAAOxE,aAAcwE,GAAOvE,eAEjEjc,KAAK+4B,kBAAoB,IAAIvD,GAA2B,GACxDx1B,KAAKk1B,QAAU,IAAImC,GAAgB,GAEnCr3B,KAAK+4B,kBAAkBG,SAASl5B,KAAKk1B,QAAQsC,sBAAsB,GAAGjV,SACtEviB,KAAK+4B,kBAAkBI,SAASn5B,KAAKk1B,QAAQsC,sBAAsB,GAAGjV,SACtEviB,KAAK+4B,kBAAkBK,SAASp5B,KAAKk1B,QAAQsC,sBAAsB,GAAGjV,SACtEviB,KAAK+4B,kBAAkBM,SAASr5B,KAAKk1B,QAAQsC,sBAAsB,GAAGjV,SACtEviB,KAAK+4B,kBAAkBO,SAASt5B,KAAKk1B,QAAQsC,sBAAsB,GAAGjV,SAEtEviB,KAAK+4B,kBAAkBQ,mBAAmB,GAC1Cv5B,KAAK+4B,kBAAkBS,iBAAiB,GAExCx5B,KAAKi5B,QAAQQ,gBAAgBz5B,KAAKk1B,QAAQqC,wBAAwB,GAAGhV,SAGvExiB,mBAAmB25B,GAEjB15B,KAAK+4B,kBAAkBQ,mBAAmBG,GAG5C35B,iBAAiB25B,GAEf15B,KAAK+4B,kBAAkBS,iBAAiBE,GAG1C35B,iBAAiBw2B,GAEfv2B,KAAK+4B,kBAAkBY,iBAAiBpD,GAG1Cx2B,iBAAiBw2B,GAEfv2B,KAAK+4B,kBAAkBa,iBAAiBrD,GAG1Cx2B,iBAAiBw2B,GAEfv2B,KAAK+4B,kBAAkBc,iBAAiBtD,GAG1Cx2B,iBAAiBw2B,GAEfv2B,KAAK+4B,kBAAkBe,iBAAiBvD,GAG1Cx2B,iBAAiBw2B,GAEfv2B,KAAK+4B,kBAAkBgB,iBAAiBxD,GAG1Cx2B,SAEEC,KAAKm1B,kBAELxM,GAASrH,MAAMthB,KAAKg1B,QAASxT,GAActN,SAAS,GAAM,GAC1DyU,GAASjH,OAAOlE,GAAatJ,QAASsN,GAActN,QAASlU,KAAKg1B,SAGlEh1B,KAAKk1B,QAAQG,KAAKr1B,KAAKg1B,SAAS,GAGhCrM,GAAShC,cAAc3mB,KAAK+4B,kBAAmB/4B,KAAKk1B,QAAQqC,wBAAwB,IAGpF5O,GAAS7B,KAAK9mB,KAAKg1B,aAASpuB,EAAW5G,KAAKi5B,SAG9Cl5B,kBAEMC,KAAKg1B,QAAQrf,QAAU6K,GAAOxE,cAAgBhc,KAAKg1B,QAAQxe,SAAWgK,GAAOvE,gBAE/Ejc,KAAKg1B,QAAQrT,QAAQnB,GAAOxE,aAAcwE,GAAOvE,eACjDjc,KAAKg5B,QAAQrX,QAAQnB,GAAOxE,aAAcwE,GAAOvE,iBCtGxC,MAAMiG,WAA2B8X,EAE9Cj6B,YAAYqyB,EAAMd,EAAOe,EAAKC,EAAQ2H,EAAMxY,GAE1C1Y,MAAMqpB,EAAMd,EAAOe,EAAKC,EAAQ2H,EAAMxY,GAEtCzhB,KAAKgmB,YAAc,IAAI5T,EAAM,WAC7BpS,KAAKimB,YAAc,GCPR,MAAMiU,WAA0BC,EAE7Cp6B,YAAYkwB,EAAK5K,EAAQ4U,EAAMxY,GAE7B1Y,MAAMknB,EAAK5K,EAAQ4U,EAAMxY,GAEzBzhB,KAAKgmB,YAAc,IAAI5T,EAAM,WAC7BpS,KAAKimB,YAAc,GCJvB,OAAe,CACblL,MAAOA,GACPR,KAAMA,GACN6f,gBCLa,cAA8B5f,EAE3Cza,YAAY4V,EAAOa,EAAQuC,EAAOsB,GAEhC1E,EAAQA,GAAS,EACjBa,EAASA,GAAU,EACnBuC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIO,EAAkB,CAAE7B,MAAOA,IAEtD,IAAIoB,EAAW,IAAIwE,EAAoBhJ,EAAOa,GAC9C2D,EAASwB,SAAQ,MACjB5S,MAAMoR,EAAUE,KDLlBQ,OAAQA,GACRwf,cEPa,cAA4B7f,EAEzCza,YAAY4V,EAAOa,EAAQuC,EAAOsB,GAEhC1E,EAAQA,GAAS,EACjBa,EAASA,GAAU,EACnBuC,EAAQA,GAAS,UACjBsB,EAAWA,GAAY,IAAIO,EAAkB,CAAE7B,MAAOA,IAGtDhQ,MADe,IAAI4V,EAAoBhJ,EAAOa,GAC9B6D,MCsBpB,OAAe,IAlCf,MAEEta,cAEEC,KAAKs6B,WAAa,GAGpBv6B,SAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKs6B,WAAW11B,OAAQgB,IAE1C5F,KAAKs6B,WAAW10B,GAAGwJ,OAAO4B,GAAYjB,mBAAmBlB,oBAI7D9O,mBAAmBw6B,GAEjBv6B,KAAKs6B,WAAWj0B,KAAKk0B,GAGvBx6B,sBAAsBy6B,GAEpB,IAAK,IAAI50B,EAAI,EAAGA,EAAI5F,KAAKs6B,WAAW11B,OAAQgB,IAE1C,GAAI5F,KAAKs6B,WAAW10B,GAAGoB,OAASwzB,EAE9B,OAAOx6B,KAAKs6B,WAAW10B,GAG3B5C,QAAQG,MAAM,iDAAkDq3B,KCvBrD,MAAMC,GAEnB16B,YAAY26B,EAAoBjpB,GAE9BipB,EAAqBA,GAAsB,IAAInpB,GAE/CvR,KAAK26B,WAAa,EAElB36B,KAAK06B,mBAAqBA,EAC1B16B,KAAKyR,SAAWA,EAEhBzR,KAAK46B,YAAa,EAClB56B,KAAK66B,cAAgB,EAGvB96B,SAEEiD,QAAQkgB,IAAI,OACPljB,KAAK46B,aAIVvrB,GAAKyrB,WAGsB,IAAvB96B,KAAK66B,eAEP76B,KAAK06B,mBAAmBK,gBAG1B/6B,KAAK06B,mBAAmBtrB,SACxB4B,GAAY5B,SACZ4rB,GAAqB5rB,SAErBpP,KAAK06B,mBAAmBO,gBAExBj7B,KAAKyR,SAASrC,SACdwjB,GAAGxjB,SACHwjB,GAAGlR,OAAO1hB,KAAKyR,UACfohB,GAAMnR,SAEN1hB,KAAK06B,mBAAmBQ,iBAGxBpN,GAAMxM,QACNsR,GAAGtR,QACHuR,GAAMvR,QAENthB,KAAK26B,UAAYrS,sBAAsBtoB,KAAKoP,OAAOtL,KAAK9D,OACxDA,KAAK66B,iBAGP96B,QAEMC,KAAK46B,aAET56B,KAAKyR,SAAS0T,mBAEa,IAAvBnlB,KAAK66B,eAEP76B,KAAK06B,mBAAmB9qB,WAG1B5P,KAAK46B,YAAa,EAClB56B,KAAKoP,UAGPrP,QAE0B,IAApBC,KAAK46B,aAET56B,KAAK46B,YAAa,EAClB56B,KAAK06B,mBAAmB/qB,UAExBwrB,qBAAqBn7B,KAAK26B,YAG5B56B,UAAUmlB,GAERllB,KAAK06B,mBAAmB/qB,QAAQ3P,MAChCA,KAAK06B,mBAAqBxV,EAC1BllB,KAAK06B,mBAAmB9qB,SAAS5P,MAGnCD,UAEEC,KAAKo7B,OACLp7B,KAAK66B,cAAgB,GC3FV,MAAMQ,WAAsBj5B,GAEzCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIgpB,EAGpBv7B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMwa,IAE1B1Z,EAAmB2P,aAAaL,EAAIrQ,YAAaya,GAEjDpK,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QASD,KAEEP,EAAIS,YAAY,gFAChBT,EAAIM,sBC/BK,MAAMuoB,WAAmBn5B,GAEtCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIkpB,GAAgBD,WAGpCx7B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QASAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBC/BK,MAAM0oB,WAAkBt5B,GAErCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIqpB,GAAmBC,cAGvC77B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBC9BK,MAAM6oB,WAAmBz5B,GAEtCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI0gB,EAGpBjzB,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,GAChBR,EAAIM,sBC9BK,MAAM8oB,WAAsB15B,GAEzCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIypB,EAClB/7B,KAAKsS,OAAO0pB,QAAQ15B,EAAM,KAC1BtC,KAAKi8B,KAAO,CACV,SACA,SACA,SACA,SACA,SACA,UAIJl8B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKi8B,MAAOnf,IAE3B1Z,EAAmB2P,aAAaL,EAAIrQ,YAAaya,GAEjDpK,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQA9P,IAECuP,EAAIS,YAAY,+EAAsFhQ,GACtGuP,EAAIM,sBCzCK,MAAMkpB,GAEnBn8B,YAAY6lB,EAAQuW,GAAO,EAAMC,EAAS,GAExCp8B,KAAK4lB,OAASA,EACd5lB,KAAKm8B,KAAOA,EACZn8B,KAAKo8B,OAASA,EAEdp8B,KAAKq8B,WAAQz1B,EAGf7G,KAAKu8B,GAEHt8B,KAAKq8B,MAAQ,IAAIE,EAAWD,GAC5Bt8B,KAAKq8B,MAAMG,UAAUx8B,KAAK4lB,QAC1B5lB,KAAKq8B,MAAMI,QAAQz8B,KAAKm8B,MACxBn8B,KAAKq8B,MAAMK,UAAU18B,KAAKo8B,QAG5Br8B,OAEEC,KAAKq8B,MAAMltB,OAGbpP,QAEEC,KAAKq8B,MAAMM,QAGb58B,OAEEC,KAAKq8B,MAAMjB,OAGbwB,iBAEE,OAAO58B,KAAKq8B,MAAMQ,WCjCP,MAAMC,WAAoB16B,GAEvCrC,YAAYsC,EAAaC,EAAK65B,GAAO,EAAMC,EAAS,EAAG75B,GAErDwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIyqB,EAClB/8B,KAAKm8B,KAAOA,EACZn8B,KAAKo8B,OAASA,EAGhBr8B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMsjB,IAE1BxiB,EAAmB2P,aAAaL,EAAIrQ,YAAa,IAAI65B,GAAUtW,EAAQ5lB,KAAKm8B,KAAMn8B,KAAKo8B,SAEvF1pB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QASA9P,IAECuP,EAAIS,YAAY,8EAAqFhQ,GACrGuP,EAAIM,sBClCK,MAAMgqB,WAAkB56B,GAErCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI2qB,GAAeD,UAGnCj9B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,iLACtBR,EAAIM,sBC9BK,MAAMkqB,WAAmB96B,GAEtCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI6qB,EAGpBp9B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMkT,IAE1BpS,EAAmB2P,aAAaL,EAAIrQ,YAAamT,GAEjD9C,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,iLACtBR,EAAIM,sBC5BK,MAAMoqB,WAA0Bh7B,GAE7CrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI+qB,GAAgBC,WAClCt9B,KAAKsS,OAAOirB,YAAYC,GAG1Bz9B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm7B,IAE1Br6B,EAAmB2P,aAAaL,EAAIrQ,YAAao7B,GAEjD/qB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBChCK,MAAM0qB,WAAyBt7B,GAE5CrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI0gB,EAGpBjzB,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMiT,IAE1BnS,EAAmB2P,aAAaL,EAAIrQ,YAAaqQ,EAAIirB,WAAWpoB,IAEhE7C,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,GAChBR,EAAIM,qBAKRjT,WAAW69B,GAET,IAAIC,EAAeD,EAAS3wB,MAAM,MAEY,KAA1C4wB,EAAaA,EAAaj5B,OAAS,IAErCi5B,EAAaC,MAGf,IAAIC,EAAY,GAEhB,IAAK,IAAIn4B,EAAI,EAAGA,EAAIi4B,EAAaj5B,OAAQgB,GAAK,EAC9C,CACE,IAAImC,EAAI6E,WAAWixB,EAAaj4B,EAAI,IAChCqI,EAAIrB,WAAWixB,EAAaj4B,EAAI,IAChC+U,EAAI/N,WAAWixB,EAAaj4B,EAAI,IACpCm4B,EAAU13B,KAAK,IAAI23B,EAAaj2B,EAAGkG,EAAG0M,IAExC,OAAOojB,GCrDI,MAAME,WAA6B77B,GAEhDrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI4rB,GAA0BD,qBAC5Cj+B,KAAKm+B,WAAa,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,WAG5Ep+B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAO0pB,QAAQh8B,KAAKsC,KACtBi7B,YAAYa,GACZzrB,KAAK3S,KAAKm+B,YAAaV,IAEtBr6B,EAAmB2P,aAAaL,EAAIrQ,YAAao7B,GAEjD/qB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBCjCG,MAAMqrB,WAAwBj8B,GAE3CrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAIkpB,GAAgBD,WAClCv7B,KAAKs+B,aAAe,IAAIC,GAAiBC,YAEzCx+B,KAAKs+B,aAAaG,eAAej+B,OAAOk+B,oBACxC1+B,KAAKs+B,aAAaK,iBAAiB,CAAEC,KAAM,OAC3C5+B,KAAKsS,OAAOusB,eAAe7+B,KAAKs+B,cAGlCv+B,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,EAAM,qLACtBR,EAAIM,sBCpCK,MAAM8rB,WAAmB18B,GAEtCrC,YAAYsC,EAAaC,EAAKC,GAE5BwG,MAAM1G,EAAaC,EAAKC,GACxBvC,KAAKsS,OAAS,IAAI0gB,EAGpBjzB,sBAAsBqD,GAEpB,IAAIsP,EAAM1S,KAEVA,KAAKsS,OAAOK,KAAK3S,KAAKsC,KAAMm5B,IAE1Br4B,EAAmB2P,aAAaL,EAAIrQ,YAAao5B,GAEjD/oB,EAAI7N,0BAA0B,EAAG,GACjC6N,EAAIM,qBAELC,QAQAC,IAECR,EAAIS,YAAYD,GAChBR,EAAIM,sBCjBK,MAAM+rB,GAEnBh/B,YAAYi/B,GAEVh/B,KAAKi/B,iBAAmB,GACxBj/B,KAAKg/B,WAAaA,GAAc,gBAGlCj/B,YAAYsC,EAAaC,EAAKC,GAE5BvC,KAAKi/B,iBAAiB54B,KAAK,IAAIg1B,GAAch5B,EAAaC,EAAKC,IAGjExC,SAASsC,EAAaC,EAAKC,GAEzBvC,KAAKi/B,iBAAiB54B,KAAK,IAAIk1B,GAAWl5B,EAAaC,EAAKC,IAG9DxC,UAAUsC,EAAaC,EAAKmP,EAAUa,EAAQ/P,GAE5CvC,KAAKi/B,iBAAiB54B,KAAK,IAAIgM,GAAYhQ,EAAaC,EAAKmP,EAAUa,EAAQ/P,IAGjFxC,eAAesC,EAAaC,EAAKC,GAE/BvC,KAAKi/B,iBAAiB54B,KAAK,IAAIg4B,GAAgBh8B,EAAaC,EAAKC,IAGnExC,QAAQsC,EAAaC,EAAKC,GAExBvC,KAAKi/B,iBAAiB54B,KAAK,IAAIq1B,GAAUr5B,EAAaC,EAAKC,IAG7DxC,QAAQsC,EAAaC,EAAKC,GAExBvC,KAAKi/B,iBAAiB54B,KAAK,IAAI22B,GAAU36B,EAAaC,EAAKC,IAG7DxC,SAASsC,EAAaC,EAAKC,GAEzBvC,KAAKi/B,iBAAiB54B,KAAK,IAAIy4B,GAAWz8B,EAAaC,EAAKC,IAG9DxC,SAASsC,EAAaC,EAAKC,GAEzBvC,KAAKi/B,iBAAiB54B,KAAK,IAAIw1B,GAAWx5B,EAAaC,EAAKC,IAG9DxC,YAAYsC,EAAaC,EAAKC,GAE5BvC,KAAKi/B,iBAAiB54B,KAAK,IAAIy1B,GAAcz5B,EAAaC,EAAKC,IAGjExC,UAAUsC,EAAaC,EAAK65B,EAAMC,EAAQ75B,GAExCvC,KAAKi/B,iBAAiB54B,KAAK,IAAIy2B,GAAYz6B,EAAaC,EAAK65B,EAAMC,EAAQ75B,IAG7ExC,SAASsC,EAAaC,EAAKC,GAEzBvC,KAAKi/B,iBAAiB54B,KAAK,IAAI0sB,GAAW1wB,EAAaC,EAAKC,IAG9DxC,gBAAgBsC,EAAaC,EAAKC,GAEhCvC,KAAKi/B,iBAAiB54B,KAAK,IAAIq3B,GAAiBr7B,EAAaC,EAAKC,IAGpExC,QAAQsC,EAAaC,EAAKC,GAExBvC,KAAKi/B,iBAAiB54B,KAAK,IAAI+2B,GAAkB/6B,EAAaC,EAAKC,IAGrExC,gBAAgBsC,EAAaC,EAAKC,GAEhCvC,KAAKi/B,iBAAiB54B,KAAK,IAAI43B,GAAqB57B,EAAaC,EAAKC,IAGxExC,SAASsC,EAAaC,EAAKC,GAEzBvC,KAAKi/B,iBAAiB54B,KAAK,IAAI62B,GAAW76B,EAAaC,EAAKC,IAG9DxC,WAAWuS,GAETtS,KAAKi/B,iBAAiB54B,KAAKiM,GAG7BvS,KAAKqD,GAEH,IAAK,IAAIwC,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAEhD5F,KAAKi/B,iBAAiBr5B,GAAG+M,KAAKvP,GAAsB2N,IAIxDmuB,uBAEE,IAAIC,GAAW,EACf,IAAK,IAAIv5B,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAEhDu5B,EAAWA,GAAYn/B,KAAKi/B,iBAAiBr5B,GAAGlD,aAElD,OAAOy8B,EAGTC,iBAEE,IAAIz8B,GAAY,EAChB,IAAK,IAAIiD,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAEhDjD,EAAYA,GAAa3C,KAAKi/B,iBAAiBr5B,GAAGjD,UAEpD,OAAOA,EAGT5C,eAEEiD,QAAQG,MAAM,UAAYnD,KAAKg/B,WAAa,iCAC5C,IAAK,IAAIp5B,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAE5C5F,KAAKi/B,iBAAiBr5B,GAAGjD,WAE3B3C,KAAKi/B,iBAAiBr5B,GAAGy5B,cAK/Bt/B,eAEE,OAAOC,KAAKs/B,mBAAqBt/B,KAAKu/B,kBAGxCx/B,mBAEE,IAAIyC,EAAe,EAEnB,IAAK,IAAIoD,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAEhDpD,GAAgBxC,KAAKi/B,iBAAiBr5B,GAAGpD,aAG3C,OAAOA,EAGTzC,kBAEE,IAAI0C,EAAc,EAElB,IAAK,IAAImD,EAAI,EAAGA,EAAI5F,KAAKi/B,iBAAiBr6B,OAAQgB,IAEhDnD,GAAezC,KAAKi/B,iBAAiBr5B,GAAGnD,YAG1C,OAAOA,GCtKI,MAAM+8B,WAAyBjrB,GAE5CxU,cAEEgJ,QACA/I,KAAKy/B,YAAc,IAAI1xB,EAAQ,EAAG,GAGpChO,OAAOwV,EAAMM,EAAYnB,EAAQhC,GAE/BA,EAAI8C,KAAOK,EAAWL,KAEtB,IAAIkqB,EAAY1/B,KAAK2/B,cAAcpqB,EAAMM,EAAWL,MAGpDd,EAAOiB,MAAQ7O,KAAK2O,KAAKiqB,EAAU33B,EAAyB,EAArB/H,KAAKy/B,YAAY13B,GACxD2M,EAAO8B,OAAS1P,KAAK2O,KAAKiqB,EAAUzxB,EAAyB,EAArBjO,KAAKy/B,YAAYxxB,GACzDyE,EAAIqL,UAAU,EAAG,EAAGrJ,EAAOiB,MAAOjB,EAAO8B,QAGzC9D,EAAIktB,YAAc,EAClBltB,EAAImL,UAAYhI,EAAWC,YAAc,UACzCpD,EAAIoL,SAAS,EAAG,EAAGpJ,EAAOiB,MAAOjB,EAAO8B,QACxC9D,EAAIktB,YAAc,EAElBltB,EAAIktB,YAAc,EAElBltB,EAAI8C,KAAOK,EAAWL,KACtB9C,EAAImL,UAAYhI,EAAWC,YAAc,UACzCpD,EAAImtB,aAAe,SAEnBntB,EAAIotB,UAAYjqB,EAAWiqB,WAAa,SAClB,WAAlBptB,EAAIotB,UAENptB,EAAIqtB,SAASxqB,EAAMb,EAAOiB,MAAQ,EAAGjB,EAAO8B,OAAS,GAIrD9D,EAAIqtB,SAASxqB,EAAM,EAAGb,EAAO8B,OAAS,ICzC7B,MAAMwpB,GAEnBjgC,YAAYiH,GAEVhH,KAAKgH,KAAOA,EACZhH,KAAK8Q,eAAYlK,EAEjBo0B,GAAqBiF,mBAAmBjgC,MAG1CD,MAAM+Q,GAEJ9Q,KAAK8Q,UAAYA,EAGnB/Q,WAEEC,KAAK8Q,UAAUI,UAAUE,OAAO,UAGlCrR,UAIAA,UAEEC,KAAK8Q,UAAUI,UAAUC,IAAI,UAG/BpR,YAAYsR,GAEVrR,KAAK8Q,UAAUQ,MAAMD,QAAUA,GCjCpB,MAAM6uB,GAEnBngC,eAGAA,qBAAqBogC,EAAQpR,GAE3BA,EAAO1oB,KAAK+5B,MAAMrR,EAAQoR,GAG5BpgC,yBAAyBsgC,EAAO99B,GAE9B,IAAI+9B,EAAmB/9B,EAAO89B,EAAMz7B,OAEpC,IAAK,IAAIgB,EAAI,EAAGA,EAAI06B,EAAkB16B,IAEpCy6B,EAAMh6B,KAAKg6B,EAAMz6B,GAAGyX,SAIxBtd,mBAAmBsgC,EAAO3S,GAExB,IAAI/B,EAAQ0U,EAAMz/B,QAAQ8sB,GACtB/B,GAAS,GAEX0U,EAAM1S,OAAOhC,EAAO,GAIxB5rB,yBAAyBke,EAAQ8Q,GAE/B,IAAIwR,EAAgBtiB,EAAO,GACvBuiB,EAAmBD,EAAchiB,WAAWwQ,GAChD,IAAK,IAAInpB,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IAE7BqY,EAAOrY,GAAG2Y,WAAWwQ,GAAUyR,IAEjCD,EAAgBtiB,EAAOrY,GACvB46B,EAAmBviB,EAAOrY,GAAG2Y,WAAWwQ,IAG5C,OAAOwR,EAGTxgC,8BAA8B0gC,GAE5B,IAAIC,EAAMh7B,OAAOC,KAAK86B,GAClBtR,EAAM,GACV,IAAK,IAAIvpB,EAAI,EAAGA,EAAI86B,EAAI97B,OAAQgB,IAE9BupB,EAAI9oB,KAAKo6B,EAAIC,EAAI96B,KAEnB,OAAOupB,GClDI,MAAMwR,GAEnB5gC,cAEEC,KAAKsf,OAAS,IAAIzE,EAGpB9a,WAAWke,EAAQ2iB,EAAmBC,EAAcxb,GAElDrlB,KAAKsf,OAAOpG,cAAc+E,GAE1B,IAAI+R,EAAQlpB,KAAKg6B,SAASD,EAAe,GACrC3Q,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS3K,GAAW,EAEpD0b,EAAkB/gC,KAAKghC,oBAAoBJ,EAAmB5Q,GAC9DiR,EAAoBjhC,KAAKkhC,sBAAsBN,EAAmB5Q,GAClEmR,EAAoBnhC,KAAKohC,sBAAsBR,EAAmB1Q,GAClEmR,EAAqBrhC,KAAKshC,uBAAuBV,EAAmB1Q,GAEpEqR,EAAqB,IAAI3oB,EAAQ,EAAG,GAAI,GAAGmX,gBAAgB6Q,GAE3DY,EAAgBxhC,KAAKsf,OAAOd,OAAOnB,QAEnCokB,EAAqBzhC,KAAK0hC,yBAA8C,EAArB1hC,KAAKsf,OAAO7I,OAAiC,EAArBzW,KAAKsf,OAAO7I,OAAYoqB,EAAcxb,GACjHsc,EAAUH,EAAcnkB,QAAQlM,IAAIowB,EAAmBlkB,QAAQhB,gBAAqC,EAAtBolB,IAE9EG,GAAc,IAAIlS,GAAQe,8BAA8BsQ,EAAiBY,GACzEE,GAAc,IAAInS,GAAQe,8BAA8BwQ,EAAmBU,GAE3EG,GAAe,IAAIpS,GAAQe,8BAA8B0Q,EAAmBQ,GAC5EI,GAAe,IAAIrS,GAAQe,8BAA8B4Q,EAAoBM,GAEjF3hC,KAAKgiC,+BAA+BL,EAAS1jB,EAAQ2iB,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASnR,8BAA8BsQ,EAAiBY,GACxDE,EAAWpR,8BAA8BwQ,EAAmBU,GAE5DG,EAAWrR,8BAA8B0Q,EAAmBQ,GAC5DI,EAAYtR,8BAA8B4Q,EAAoBM,GAE9D,IAAInB,EAAmByB,EAAAA,EAEnBC,EAAcX,EAAmBlkB,QAAQhB,gBAAqC,EAAtBolB,GAC5D,IAAK,IAAI77B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAIsY,EAAO,IAAIikB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAI+wB,IAE1DE,EAAwB,IAAIxpB,EAC5BypB,EAAyB,IAAIzpB,EAE7B0pB,EAA0B,IAAI1pB,EAC9B2pB,EAA0B,IAAI3pB,EAElCgpB,EAASY,cAActkB,EAAOkkB,GAC9BP,EAAWW,cAActkB,EAAMmkB,GAE/BP,EAAWU,cAActkB,EAAOokB,GAChCP,EAAYS,cAActkB,EAAMqkB,GAE5BH,EAAqBx9B,SAAW,MAElC5B,QAAQkgB,IAAI,4BAA6Btd,GAEvCy8B,EAAuBz9B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC08B,EAAuB19B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC28B,EAAwB39B,SAAW,MAErC5B,QAAQkgB,IAAI,+BAAgCtd,GAG9C,IAAI68B,EAAoBxkB,EAAOrY,GAAGyX,QAAQoB,IAAI2jB,GAAsBx9B,SAChE89B,EAAoBzkB,EAAOrY,GAAGyX,QAAQoB,IAAI4jB,GAAwBz9B,SAElE+9B,EAAsB1kB,EAAOrY,GAAGyX,QAAQoB,IAAI6jB,GAAwB19B,SACpEg+B,EAAsB3kB,EAAOrY,GAAGyX,QAAQoB,IAAI8jB,GAAyB39B,SAErEi+B,EAAkB/7B,KAAKe,IAAI46B,EAAiBC,GAC5CI,EAAkBh8B,KAAKe,IAAI86B,EAAmBC,GAE9C/6B,EAAMf,KAAKe,IAAIg7B,EAAcC,GAE7Bj7B,EAAM24B,IAERA,EAAmB34B,GAIvB,IAAIk7B,EAAqBxB,EAAmBlkB,QAAQhB,eAAemkB,GAGnE,OAFuBmB,EAAQtkB,QAAQlM,IAAI4xB,GAK7ChjC,+BAA+BijC,EAAY/kB,EAAQ2iB,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,IAAIkB,EAAkBjjC,KAAKkjC,wBAAwBjlB,EAAQ4jB,EAAYD,EAAUhB,GAC7EuC,EAAoBnjC,KAAKojC,0BAA0BnlB,EAAQ6jB,EAAYC,EAAanB,GAExFoC,EAAW7xB,IAAI8xB,GACfD,EAAW7xB,IAAIgyB,GAGjBpjC,wBAAwBke,EAAQ4jB,EAAYD,EAAUhB,GAEpD,IAEIyC,EACAC,EAHAC,EAA+BtB,EAAAA,EAC/BuB,EAAkCvB,EAAAA,EAIlCwB,EAAS,IAAI7qB,EAAQ,EAAG,EAAG,GAAGmX,gBAAgB6Q,GAClD,IAAK,IAAIh7B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAI89B,EAAc,IAAIvB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIsyB,EAAOpmB,QAAQhB,gBAAgB,OAChGsnB,EAAc,IAAIxB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIsyB,EAAOpmB,QAAQhB,eAAe,OAE/FgmB,EAA0B,IAAIzpB,EAC9BwpB,EAAuB,IAAIxpB,EAE/BipB,EAAWW,cAAckB,EAAYrB,GACrCT,EAASY,cAAcmB,EAASvB,GAEhC,IAAIwB,EAAcvB,EAAuB9jB,WAAWN,EAAOrY,IACvDi+B,EAAczB,EAAqB7jB,WAAWN,EAAOrY,IAErDw8B,EAAqBx9B,SAAW,MAElC5B,QAAQkgB,IAAI,qCAAsCtd,GAEhDy8B,EAAuBz9B,SAAW,MAEpC5B,QAAQkgB,IAAI,uCAAwCtd,GAGlDg+B,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqBrlB,EAAOrY,IAE1Bi+B,EAAUN,IAEZA,EAA+BM,EAC/BR,EAAmBplB,EAAOrY,IAI9B5C,QAAQkgB,IAAImgB,EAAkBC,GAE9B,IAAIQ,GAAcP,EAA+BC,GAAkC,EAGnF,OAAOC,EAAOpmB,QAAQhB,gBAAgBynB,GAGxC/jC,0BAA0Bke,EAAQ6jB,EAAYC,EAAanB,GAEzD,IAEImD,EACAC,EAHAC,EAAkChC,EAAAA,EAClCiC,EAAkCjC,EAAAA,EAIlCkC,EAAY,IAAIvrB,EAAQ,EAAG,EAAG,GAAGmX,gBAAgB6Q,GAErD,IAAK,IAAIh7B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAIw+B,EAAa,IAAIjC,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIgzB,EAAU9mB,QAAQhB,gBAAgB,OAClGgoB,EAAa,IAAIlC,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIgzB,EAAU9mB,QAAQhB,eAAe,OAEjGimB,EAA0B,IAAI1pB,EAC9B2pB,EAA0B,IAAI3pB,EAElCkpB,EAAWU,cAAc4B,EAAY9B,GACrCP,EAAYS,cAAc6B,EAAY9B,GAEtC,IAAI+B,EAAahC,EAAuB/jB,WAAWN,EAAOrY,IACtD2+B,EAAahC,EAAwBhkB,WAAWN,EAAOrY,IAEvD08B,EAAuB19B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC28B,EAAwB39B,SAAW,MAErC5B,QAAQkgB,IAAI,+BAAgCtd,GAG1C0+B,EAAYJ,IAEdA,EAAiCI,EACjCN,EAAqB/lB,EAAOrY,IAE1B2+B,EAAaN,IAEfA,EAAkCM,EAClCR,EAAsB9lB,EAAOrY,IAIjC,IAAIk+B,GAAcG,EAAkCC,GAAkC,EAKtF,OAFAlhC,QAAQkgB,IAAI6gB,EAAqBC,GAE1BG,EAAU9mB,QAAQhB,gBAAgBynB,GAG3C/jC,oBAAoB6gC,EAAmB5Q,GAErC,IAAI+Q,EAAkB,IAAInoB,EAAQ,GAAI,EAAG,GAGzC,OAFAmoB,EAAgBhR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,GAAIoX,IACxF+Q,EAAgBhR,gBAAgB6Q,GACzBG,EAGThhC,sBAAsB6gC,EAAmB5Q,GAEvC,IAAIiR,EAAoB,IAAIroB,EAAQ,EAAG,EAAG,GAG1C,OAFAqoB,EAAkBlR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,IAAKoX,IAC3FiR,EAAkBlR,gBAAgB6Q,GAC3BK,EAGTlhC,sBAAsB6gC,EAAmB1Q,GAEvC,IAAIiR,EAAoB,IAAIvoB,EAAQ,EAAG,EAAG,GAG1C,OAFAuoB,EAAkBpR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,GAAIsX,IAC1FiR,EAAkBpR,gBAAgB6Q,GAC3BO,EAGTphC,uBAAuB6gC,EAAmB1Q,GAExC,IAAImR,EAAqB,IAAIzoB,GAAS,EAAG,EAAG,GAG5C,OAFAyoB,EAAmBtR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,IAAKsX,IAC5FmR,EAAmBtR,gBAAgB6Q,GAC5BS,EAGTthC,yBAAyB4V,EAAOa,EAAQqqB,EAAcxb,GAEpD,IAAI2K,EAAS6Q,EAAe,EAAK/5B,KAAKuB,GAAK,IACvC6nB,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS3K,GAAW,EAEpDgL,EAAQ7Z,EAAS1P,KAAKspB,IAAIJ,GAC1BM,EAAQ3a,EAAQ7O,KAAKspB,IAAIF,GAC7B,OAAOppB,KAAKC,IAAID,KAAKgB,IAAIwoB,GAAQxpB,KAAKgB,IAAIuoB,KCzP/B,MAAMqU,GAEnB3kC,uCAAuC4kC,GAErC,IAAIC,EAAUD,EAAgBhZ,MAC1BoS,EAAY4G,EAAgBh4B,aAAa,YAGzCk4B,EAAW,GAEf,IAAK,IAAIj/B,EAAI,EAAGA,EAAIg/B,EAAQ7X,MAAOnnB,GAAK,EAGtCi/B,EAASx+B,KAAK03B,EAAU+G,KAAKF,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUgH,KAAKH,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUiH,KAAKJ,EAAQvE,MAAMz6B,EAAI,KAQ/Ci/B,EAASx+B,KAAK03B,EAAU+G,KAAKF,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUgH,KAAKH,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUiH,KAAKJ,EAAQvE,MAAMz6B,EAAI,KAQ/Ci/B,EAASx+B,KAAK03B,EAAU+G,KAAKF,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUgH,KAAKH,EAAQvE,MAAMz6B,EAAI,KAC/Ci/B,EAASx+B,KAAK03B,EAAUiH,KAAKJ,EAAQvE,MAAMz6B,EAAI,KAOjD,IAAIuU,EAAW,IAAIlB,EAInB,OAFAkB,EAAS/E,aAAa,WAAY,IAAI6X,EAAgB,IAAId,aAAa0Y,GAAW,IAClFH,GAAkBO,0BAA0B9qB,GACrCA,EAGTpa,iCAAiCmlC,GAE/B,IAAIC,EAAkB,GAClBpH,EAAYmH,EAA4Bv4B,aAAa,YAEzD,IAAK,IAAI/G,EAAI,EAAGA,EAAIm4B,EAAUhR,MAAOnnB,GAAK,EAExCu/B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GAErB8+B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GAErB8+B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GACrB8+B,EAAgB9+B,KAAK,GAEvB6+B,EAA4B9vB,aAAa,cAAe,IAAI6X,EAAgB,IAAId,aAAagZ,GAAkB,KCrEpG,MAAMC,GAEnBrlC,eAGAA,sBAAsB+c,GAEpB,IAAIpI,EAASC,SAASC,cAAc,UACpCF,EAAOiB,MAAQmH,EAAMnH,MACrBjB,EAAO8B,OAASsG,EAAMtG,OAEtB,IAAIvR,EAAUyP,EAAOG,WAAW,MAGhC,OAFA5P,EAAQ0iB,UAAU7K,EAAO,EAAG,GAErB7X,EAAQogC,aAAa,EAAG,EAAGvoB,EAAMnH,MAAOmH,EAAMtG,QAGvDzW,iBAAiBulC,EAAWv9B,EAAGkG,GAE7B,IAAI8N,EAAuC,GAA3BhU,EAAIu9B,EAAU3vB,MAAQ1H,GAClClJ,EAAOugC,EAAUvgC,KACrB,OAAO,IAAI6Z,EAAQ7Z,EAAKgX,EAAW,GAAIhX,EAAKgX,EAAW,GAAIhX,EAAKgX,EAAW,GAAIhX,EAAKgX,EAAW,KC4EnG,OAAe,IAnGf,MAEEhc,eAKAA,OAAOoa,EAAUorB,GAEf,IAAIC,EAAa,GAEbC,EAAW,SACf,IAAK,IAAI7/B,EAAI,EAAGA,EAAIuU,EAASurB,MAAM9gC,OAAQgB,IAC3C,CACE,IAAI+/B,EAAO3lC,KAAK4lC,cAAczrB,EAASurB,MAAM9/B,GAAIuU,EAAS0qB,UAC1DY,EAAW3+B,KAAKe,IAAI89B,EAAMF,GAC1BD,EAAWn/B,KAAKs/B,GAGlB,IAAIE,EAAyB7lC,KAAK8lC,8BAA8BN,EAAYC,EAAUtrB,EAASurB,OAC3FK,EAAiB/lC,KAAKgmC,oBAAoBH,EAAwBN,GAEtE,OADmBvlC,KAAKimC,uBAAuBF,EAAgB5rB,EAAS0qB,UAI1E9kC,uBAAuB2lC,EAAOb,GAE5B,IAAIqB,EAAiB,GACjBC,EAAkB,GACtB,IAAK,IAAIvgC,EAAI,EAAGA,EAAI8/B,EAAM9gC,OAAQgB,IAClC,CACE,IAAIwgC,EAAOV,EAAM9/B,GAEbygC,EAAKv/B,KAAKuoB,SACViX,EAAKx/B,KAAKuoB,SAEd6W,EAAe7/B,KAAKrG,KAAKumC,qBAAqBF,EAAIC,EAAIzB,EAASuB,EAAKh5B,GAAIy3B,EAASuB,EAAK/4B,GAAIw3B,EAASuB,EAAKI,IAAInpB,SACxG8oB,GAAmBC,EAAKK,QAE1BN,EAAgB9/B,KAAK+/B,EAAKK,OAAOppB,SAGrC,MAAO,CAAEY,OAAQioB,EAAgBQ,QAASP,GAG5CpmC,oBAAoB2lC,EAAOiB,GAEzB,IAAIZ,EAAiB,GACrB,IAAK,IAAIngC,EAAI,EAAGA,EAAI+gC,EAAQ/gC,IAC5B,CACE,IACIghC,EAAgBlB,EADPne,SAASzgB,KAAKuoB,UAAYqW,EAAM9gC,OAAS,KAGtDmhC,EAAe1/B,KAAKugC,GAGtB,OAAOb,EAGThmC,8BAA8BylC,EAAYqB,EAAcnB,GAEtD,IAAIoB,EAA4B,GAChC,IAAK,IAAIlhC,EAAI,EAAGA,EAAI4/B,EAAW5gC,OAAQgB,IACvC,CACE4/B,EAAW5/B,IAAMihC,EACjB,IAAIE,EAAqBxf,SAASzgB,KAAK2nB,MAAM+W,EAAW5/B,KACxD,IAAK,IAAIohC,EAAI,EAAGA,EAAID,EAAoBC,IAEtCF,EAA0BzgC,KAAKq/B,EAAM9/B,IAGzC,OAAOkhC,EAGT/mC,cAAcqmC,EAAMvB,GAElB,IAAIoC,EAAKpC,EAASuB,EAAKh5B,GAAGiQ,QACtB6pB,EAAKrC,EAASuB,EAAK/4B,GAAGgQ,QACtBwO,EAAKgZ,EAASuB,EAAKI,GAAGnpB,QAEtB8pB,EAAOD,EAAG7pB,QAAQoB,IAAIwoB,GACtBG,EAAOvb,EAAGxO,QAAQoB,IAAIwoB,GAC1B,OAAOE,EAAK5V,MAAM6V,GAAMxiC,SAAW,EAGrC7E,qBAAqBsmC,EAAIC,EAAIW,EAAIC,EAAIrb,GAE/Bwa,EAAKC,EAAK,IAEZD,EAAK,EAAMA,EACXC,EAAK,EAAMA,GAGb,IAAIe,EAAK,GAAOhB,EAAKC,GAErB,OAAOW,EAAG5pB,QAAQhB,eAAegqB,GAAIl1B,IAAI+1B,EAAG7pB,QAAQhB,eAAeiqB,IAAKn1B,IAAI0a,EAAGxO,QAAQhB,eAAegrB,MCiE1G,OAAe,IA5Jf,MAEEtnC,SAASia,EAAOstB,GAEdttB,EAAMC,UAAUC,IAEVA,aAAiBM,IAEfN,EAAMC,WAERD,EAAMC,UAAW,IAAIlB,GAAiBsuB,aAAartB,EAAMC,WAE3DmtB,EAAgBptB,OAKtBna,eAAeia,GAEb,IAAIwtB,EAAa,GAMjB,OAJAxnC,KAAKynC,SAASztB,GAAQE,IAEpBstB,EAAWnhC,KAAK6T,EAAMC,aAEjBqtB,EAGTznC,gBAAgBia,EAAOK,EAAUrT,GAE/BgT,EAAMC,UAAUC,IAEVA,aAAiBM,SAGN5T,IAATI,GAOEkT,EAAMlT,OAASA,KALnBkT,EAAMG,SAAWA,MAczBta,oBAAoB07B,GAElB,MAAMpe,EAAQ,CACZqqB,WAAYjM,EAAKiM,WACjB1tB,MAAOyhB,EAAKzhB,MAAMqD,OAAM,IAGpBsqB,EAAgB,GAEtBlM,EAAKzhB,MAAMC,UAASxN,IAEdA,EAAKm7B,gBAEPD,EAAcl7B,EAAKzF,MAAQyF,MAI/B,MAAMo7B,EAAa,GACbC,EAAqB,GAE3BzqB,EAAMrD,MAAMC,UAASxN,IAEfA,EAAKs7B,SAEPF,EAAWp7B,EAAKzF,MAAQyF,GAGtBA,EAAKm7B,gBAEPE,EAAmBr7B,EAAKzF,MAAQyF,MAIpC,IAAK,IAAIzF,KAAQ2gC,EACjB,CACE,MACMK,EADcL,EAAc3gC,GACLghC,SACvBC,EAAmBH,EAAmB9gC,GAEtCkhC,EAAoB,GAE1B,IAAK,IAAItiC,EAAI,EAAGA,EAAIoiC,EAASG,MAAMvjC,SAAUgB,EAC7C,CACE,MAAMwiC,EAAYP,EAAWG,EAASG,MAAMviC,GAAGoB,MAC/CkhC,EAAkB7hC,KAAK+hC,GAGzBH,EAAiBnkC,KACf,IAAIukC,GAASH,EAAmBF,EAASM,cACzCL,EAAiBM,aAGrB,OAAOlrB,EAGTtd,kBAAkBia,EAAOwuB,EAAMC,GAE7BzuB,EAAMC,UAAUC,IAEVA,aAAiBM,IAEnBN,EAAMwuB,WAAaF,EACnBtuB,EAAMyuB,cAAgBF,MAK5B1oC,cAAcia,EAAOsQ,EAAagd,GAEhCttB,EAAMC,UAAUwmB,IAEVA,EAAIz5B,OAASsjB,GAEfgd,EAAgB7G,MAKtB1gC,WAAWia,EAAOsQ,GAEhB,IAAI2H,EAQJ,OAPAjY,EAAMC,UAAUwmB,IAEVA,EAAIz5B,OAASsjB,IAEf2H,EAASwO,MAGNxO,EAGTlyB,mBAAmBia,EAAO4uB,GAExB,IAAI3W,EAQJ,OAPAjY,EAAMC,UAAUwmB,IAEVA,EAAIrc,YAAYpd,OAAS4hC,IAE3B3W,EAASwO,MAGNxO,IC5JI,MAAM4W,GAEnB9oC,eAIAA,mBAAmB+oC,GAGjB,IAAIrI,EAAM,GAEV,GAAqB,IAAjBqI,EAAIC,UAGN,GAAID,EAAIE,WAAWpkC,OAAS,EAC5B,CACE67B,EAAI,eAAiB,GACrB,IAAK,IAAIuG,EAAI,EAAGA,EAAI8B,EAAIE,WAAWpkC,OAAQoiC,IAC3C,CACE,IAAIiC,EAAYH,EAAIE,WAAWE,KAAKlC,GACpCvG,EAAI,eAAewI,EAAUE,UAAYF,EAAUG,iBAI/B,IAAjBN,EAAIC,WAEXtI,EAAMqI,EAAIM,WAIZ,GAAIN,EAAIO,gBAEN,IAAK,IAAIzjC,EAAI,EAAGA,EAAIkjC,EAAIQ,WAAW1kC,OAAQgB,IAC3C,CACE,IAAIsjC,EAAOJ,EAAIQ,WAAWJ,KAAKtjC,GAC3BujC,EAAWD,EAAKC,SACpB,QAA+B,IAAnB1I,EAAI0I,GAEd1I,EAAI0I,GAAYnpC,KAAKupC,YAAYL,OAGnC,CACE,QAAoC,IAAxBzI,EAAI0I,GAAc,KAC9B,CACE,IAAIK,EAAM/I,EAAI0I,GACd1I,EAAI0I,GAAY,GAChB1I,EAAI0I,GAAU9iC,KAAKmjC,GAErB/I,EAAI0I,GAAU9iC,KAAKrG,KAAKupC,YAAYL,KAI1C,OAAOzI,GCpDI,MAAMgJ,GAEnB1pC,eAIAA,eAAe2pC,GAEbA,EAAWA,EAASz8B,MAAM,KAE1B,IAAI08B,EAAQ9nC,OAAO6nC,EAAS,IAC5BC,EAAgB,GAARA,EAAa,GAAK,IAE1B,IAAIC,EAAU/nC,OAAO6nC,EAAS,IAC9BE,EAAoB,GAAVA,EAAe,IAEzB,IAAIC,EAAUhoC,OAAO6nC,EAAS,IAG9B,OAFAG,GAAoB,IAEbF,EAAQC,EAAUC,GClBd,MAAMC,GAEnB/pC,cAEEC,KAAKsf,OAAS,IAAIzE,EAGpB9a,WAAWke,EAAQ2iB,EAAmBC,EAAcxb,GAElDrlB,KAAKsf,OAAOpG,cAAc+E,GAE1B,IAAI+R,EAAQ/pB,EAAM66B,SAASD,EAAe,GACtC3Q,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS3K,GAAW,EAEpD0b,EAAkB/gC,KAAKghC,oBAAoBJ,EAAmB5Q,GAC9DiR,EAAoBjhC,KAAKkhC,sBAAsBN,EAAmB5Q,GAClEmR,EAAoBnhC,KAAKohC,sBAAsBR,EAAmB1Q,GAClEmR,EAAqBrhC,KAAKshC,uBAAuBV,EAAmB1Q,GAEpEqR,EAAqB,IAAI3oB,EAAQ,EAAG,GAAI,GAAGmX,gBAAgB6Q,GAE3DY,EAAgBxhC,KAAKsf,OAAOd,OAAOnB,QAEnCokB,EAAqBzhC,KAAK0hC,yBAA8C,EAArB1hC,KAAKsf,OAAO7I,OAAiC,EAArBzW,KAAKsf,OAAO7I,OAAYoqB,EAAcxb,GACjHsc,EAAUH,EAAcnkB,QAAQlM,IAAIowB,EAAmBlkB,QAAQhB,gBAAqC,EAAtBolB,IAE9EG,GAAc,IAAIlS,GAAQe,8BAA8BsQ,EAAiBY,GACzEE,GAAc,IAAInS,GAAQe,8BAA8BwQ,EAAmBU,GAE3EG,GAAe,IAAIpS,GAAQe,8BAA8B0Q,EAAmBQ,GAC5EI,GAAe,IAAIrS,GAAQe,8BAA8B4Q,EAAoBM,GAEjF3hC,KAAKgiC,+BAA+BL,EAAS1jB,EAAQ2iB,EAAmBgB,EAAUC,EAAYC,EAAYC,GAE1GH,EAASnR,8BAA8BsQ,EAAiBY,GACxDE,EAAWpR,8BAA8BwQ,EAAmBU,GAE5DG,EAAWrR,8BAA8B0Q,EAAmBQ,GAC5DI,EAAYtR,8BAA8B4Q,EAAoBM,GAE9D,IAAInB,EAAmByB,EAAAA,EAEnBC,EAAcX,EAAmBlkB,QAAQhB,gBAAqC,EAAtBolB,GAC5D,IAAK,IAAI77B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAIsY,EAAO,IAAIikB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAI+wB,IAE1DE,EAAwB,IAAIxpB,EAC5BypB,EAAyB,IAAIzpB,EAE7B0pB,EAA0B,IAAI1pB,EAC9B2pB,EAA0B,IAAI3pB,EAElCgpB,EAASY,cAActkB,EAAOkkB,GAC9BP,EAAWW,cAActkB,EAAMmkB,GAE/BP,EAAWU,cAActkB,EAAOokB,GAChCP,EAAYS,cAActkB,EAAMqkB,GAE5BH,EAAqBx9B,SAAW,MAElC5B,QAAQkgB,IAAI,4BAA6Btd,GAEvCy8B,EAAuBz9B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC08B,EAAuB19B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC28B,EAAwB39B,SAAW,MAErC5B,QAAQkgB,IAAI,+BAAgCtd,GAG9C,IAAI68B,EAAoBxkB,EAAOrY,GAAGyX,QAAQoB,IAAI2jB,GAAsBx9B,SAChE89B,EAAoBzkB,EAAOrY,GAAGyX,QAAQoB,IAAI4jB,GAAwBz9B,SAElE+9B,EAAsB1kB,EAAOrY,GAAGyX,QAAQoB,IAAI6jB,GAAwB19B,SACpEg+B,EAAsB3kB,EAAOrY,GAAGyX,QAAQoB,IAAI8jB,GAAyB39B,SAErEi+B,EAAkB/7B,KAAKe,IAAI46B,EAAiBC,GAC5CI,EAAkBh8B,KAAKe,IAAI86B,EAAmBC,GAE9C/6B,EAAMf,KAAKe,IAAIg7B,EAAcC,GAE7Bj7B,EAAM24B,IAERA,EAAmB34B,GAIvB,IAAIk7B,EAAqBxB,EAAmBlkB,QAAQhB,eAAemkB,GAGnE,OAFuBmB,EAAQtkB,QAAQlM,IAAI4xB,GAK7ChjC,+BAA+BijC,EAAY/kB,EAAQ2iB,EAAmBgB,EAAUC,EAAYC,EAAYC,GAEtG,IAAIkB,EAAkBjjC,KAAKkjC,wBAAwBjlB,EAAQ4jB,EAAYD,EAAUhB,GAC7EuC,EAAoBnjC,KAAK+pC,0BAA0B9rB,EAAQ6jB,EAAYC,EAAanB,GAExFoC,EAAW7xB,IAAI8xB,GACfD,EAAW7xB,IAAIgyB,GAGjBpjC,wBAAwBke,EAAQ4jB,EAAYD,EAAUhB,GAEpD,IAAI2C,EAA+BtB,EAAAA,EAC/BuB,EAAkCvB,EAAAA,EAIlCwB,EAAS,IAAI7qB,EAAQ,EAAG,EAAG,GAAGmX,gBAAgB6Q,GAClD,IAAK,IAAIh7B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAI89B,EAAc,IAAIvB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIsyB,EAAOpmB,QAAQhB,gBAAgB,OAChGsnB,EAAc,IAAIxB,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIsyB,EAAOpmB,QAAQhB,eAAe,OAE/FgmB,EAA0B,IAAIzpB,EAC9BwpB,EAAuB,IAAIxpB,EAE/BipB,EAAWW,cAAckB,EAAYrB,GACrCT,EAASY,cAAcmB,EAASvB,GAEhC,IAAIwB,EAAcvB,EAAuB9jB,WAAWN,EAAOrY,IACvDi+B,EAAczB,EAAqB7jB,WAAWN,EAAOrY,IAErDw8B,EAAqBx9B,SAAW,MAElC5B,QAAQkgB,IAAI,qCAAsCtd,GAEhDy8B,EAAuBz9B,SAAW,MAEpC5B,QAAQkgB,IAAI,uCAAwCtd,GAGlDg+B,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAUN,IAEZA,EAA+BM,GAKnC,IAAIC,GAAcP,EAA+BC,GAAkC,EAGnF,OAAOC,EAAOpmB,QAAQhB,gBAAgBynB,GAGxC/jC,0BAA0Bke,EAAQ6jB,EAAYC,EAAanB,GAEzD,IAAIqD,EAAkChC,EAAAA,EAClCiC,EAAkCjC,EAAAA,EAIlCkC,EAAY,IAAIvrB,EAAQ,EAAG,EAAG,GAAGmX,gBAAgB6Q,GAErD,IAAK,IAAIh7B,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACE,IAAIw+B,EAAa,IAAIjC,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIgzB,EAAU9mB,QAAQhB,gBAAgB,OAClGgoB,EAAa,IAAIlC,EAAMlkB,EAAOrY,GAAGyX,QAASY,EAAOrY,GAAGyX,QAAQlM,IAAIgzB,EAAU9mB,QAAQhB,eAAe,OAEjGimB,EAA0B,IAAI1pB,EAC9B2pB,EAA0B,IAAI3pB,EAElCkpB,EAAWU,cAAc4B,EAAY9B,GACrCP,EAAYS,cAAc6B,EAAY9B,GAEtC,IAAI+B,EAAahC,EAAuB/jB,WAAWN,EAAOrY,IACtD2+B,EAAahC,EAAwBhkB,WAAWN,EAAOrY,IAEvD08B,EAAuB19B,SAAW,MAEpC5B,QAAQkgB,IAAI,8BAA+Btd,GAEzC28B,EAAwB39B,SAAW,MAErC5B,QAAQkgB,IAAI,+BAAgCtd,GAG1C0+B,EAAYJ,IAEdA,EAAiCI,GAG/BC,EAAaN,IAEfA,EAAkCM,GAKtC,IAAIT,GAAcG,EAAkCC,GAAkC,EAGtF,OAAOC,EAAU9mB,QAAQhB,gBAAgBynB,GAG3C/jC,oBAAoB6gC,EAAmB5Q,GAErC,IAAI+Q,EAAkB,IAAInoB,EAAQ,GAAI,EAAG,GAGzC,OAFAmoB,EAAgBhR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,GAAIoX,IACxF+Q,EAAgBhR,gBAAgB6Q,GACzBG,EAGThhC,sBAAsB6gC,EAAmB5Q,GAEvC,IAAIiR,EAAoB,IAAIroB,EAAQ,EAAG,EAAG,GAG1C,OAFAqoB,EAAkBlR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,IAAKoX,IAC3FiR,EAAkBlR,gBAAgB6Q,GAC3BK,EAGTlhC,sBAAsB6gC,EAAmB1Q,GAEvC,IAAIiR,EAAoB,IAAIvoB,EAAQ,EAAG,EAAG,GAG1C,OAFAuoB,EAAkBpR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,GAAIsX,IAC1FiR,EAAkBpR,gBAAgB6Q,GAC3BO,EAGTphC,uBAAuB6gC,EAAmB1Q,GAExC,IAAImR,EAAqB,IAAIzoB,GAAS,EAAG,EAAG,GAG5C,OAFAyoB,EAAmBtR,iBAAgB,IAAIyU,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,IAAKsX,IAC5FmR,EAAmBtR,gBAAgB6Q,GAC5BS,EAGTthC,yBAAyB4V,EAAOa,EAAQqqB,EAAcxb,GAEpD,IAAI2K,EAAS6Q,EAAe,EAAK/5B,KAAKuB,GAAK,IACvC6nB,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS3K,GAAW,EAEpDgL,EAAQ7Z,EAAS1P,KAAKspB,IAAIJ,GAC1BM,EAAQ3a,EAAQ7O,KAAKspB,IAAIF,GAC7B,OAAOppB,KAAKC,IAAID,KAAKgB,IAAIwoB,GAAQxpB,KAAKgB,IAAIuoB,KCrP/B,MAAM2Z,GAEnBjqC,eAKAA,WAAWke,EAAQ2iB,EAAmBC,EAAcxb,GAElD,IAAI4kB,EAAsBrJ,EAAkBvjB,QAAQ6sB,UAEhDC,EAAkB,GAEtB,IAAK,IAAIvkC,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IAEjCukC,EAAgB9jC,KAAK4X,EAAOrY,GAAGyX,QAAQ0S,gBAAgBka,IAGzD,IAAIhrB,GAAM,IAAIC,GAAOhG,cAAcixB,GAC/B5nC,EAAO,IAAIqW,EACfqG,EAAIyD,QAAQngB,GAEZ,IAAI6nC,EAAWpqC,KAAK0hC,yBAAyBn/B,EAAKwF,EAAI,EAAGxF,EAAK0L,EAAI,EAAG4yB,EAAcxb,GAE/E7G,EAAS,IAAI5F,EAKjB,OAJAqG,EAAImS,UAAU5S,GAEdA,EAAOuR,gBAAgB6Q,GAEhB,CACLpiB,OAAQA,EACR6rB,mBAAoBD,GAIxBrqC,yBAAyB4V,EAAOa,EAAQqqB,EAAcxb,GAEpD,IAAI2K,EAAS6Q,EAAe,EAAK/5B,KAAKuB,GAAK,IACvC6nB,EAAS,EAAIppB,KAAKqpB,KAAKrpB,KAAKspB,IAAIJ,GAAS3K,GAAW,EAEpDgL,EAAQ7Z,EAAS1P,KAAKspB,IAAIJ,GAC1BM,EAAQ3a,EAAQ7O,KAAKspB,IAAIF,GAC7B,OAAOppB,KAAKC,IAAID,KAAKgB,IAAIwoB,GAAQxpB,KAAKgB,IAAIuoB,KCnC/B,MAAMia,WAAa9vB,EAEhCza,cAEE,IAAIsa,EAAW,IAAI1I,EAAe,CAChCG,SAAU,CACRK,OAAQ,CAAEzN,MAAO,IAAI0N,EAAM,aAE7BL,6OACAE,0WACAwS,WAAY,CAAE8lB,aAAa,GAC3BxrB,aAAa,EACbpL,YAAY,IAGV62B,EAAiB,IAAI7rB,EAAoB,IAAK,IAAK,IAAK,KAI5D5V,MAF2B27B,GAAkB+F,gCAAgCD,GAEjDnwB,GAE5Bra,KAAK0qC,SAAS3iC,GAAI,MCrBP,MAAMqR,WAAaoB,EAEhCza,YAAYke,GAEV,IAAI9D,EAAW,IAAIlB,EACnBkB,EAAS/E,aAAa,WAAsB,IAAI6X,EAAgB,IAAId,aAAa,IAAK,IACtFhS,EAAS/E,aAAa,gBAAsB,IAAI6X,EAAgB,IAAId,aAAa,IAAK,IACtFhS,EAAS/E,aAAa,oBAAsB,IAAI6X,EAAgB,IAAId,aAAa,IAAK,IACtFhS,EAAS/E,aAAa,cAAsB,IAAI6X,EAAgB,IAAId,aAAa,IAAK,IACtFhS,EAAS/E,aAAa,WAAsB,IAAI6X,EAAgB,IAAId,aAAa,IAAK,IAiBtFpjB,MAAMoR,EAfS,IAAIxI,EAAe,CAChCG,SAAU,CACR64B,WAAY,CAAEjmC,MAAO,IACrBkmC,QAAS,CAAElmC,MAAO,GAClBmmC,aAAc,CAAEnmC,MAAO,GACvByN,OAAQ,CAAEzN,MAAO,IAAI0N,EAAM,aAE7BL,+sBACAE,8jBACA8M,aAAa,EACbpL,YAAY,EACZ8Q,WAAY,CAAE8lB,aAAa,MAMzBtsB,GAEFje,KAAK8qC,MAAM7sB,GAIfle,MAAMke,GAEJ,IAAI4mB,EAAW,GACXkG,EAAgB,GAChBC,EAAoB,GACpBC,EAAc,GACdC,EAAW,GACXC,EAAqB,EAEzB,IAAK,IAAIvlC,EAAI,EAAGA,EAAIqY,EAAOrZ,OAAQgB,IACnC,CACEi/B,EAASx+B,KAAK4X,EAAOrY,GAAGmC,GACxB88B,EAASx+B,KAAK4X,EAAOrY,GAAGqI,GACxB42B,EAASx+B,KAAK4X,EAAOrY,GAAG+U,GACxBswB,EAAY5kC,KAAK,GAEjBw+B,EAASx+B,KAAK4X,EAAOrY,GAAGmC,GACxB88B,EAASx+B,KAAK4X,EAAOrY,GAAGqI,GACxB42B,EAASx+B,KAAK4X,EAAOrY,GAAG+U,GACxBswB,EAAY5kC,MAAM,GAElB,IAAI+kC,EAAaprC,KAAKqrC,oBAAoBptB,EAAQrY,GAClDmlC,EAAc1kC,KAAK+kC,EAAWrjC,GAC9BgjC,EAAc1kC,KAAK+kC,EAAWn9B,GAC9B88B,EAAc1kC,KAAK+kC,EAAWzwB,GAE9BowB,EAAc1kC,KAAK+kC,EAAWrjC,GAC9BgjC,EAAc1kC,KAAK+kC,EAAWn9B,GAC9B88B,EAAc1kC,KAAK+kC,EAAWzwB,GAE9B,IAAI2wB,EAAiBtrC,KAAKurC,wBAAwBttB,EAAQrY,GAC1DolC,EAAkB3kC,KAAKilC,EAAevjC,GACtCijC,EAAkB3kC,KAAKilC,EAAer9B,GACtC+8B,EAAkB3kC,KAAKilC,EAAe3wB,GAEtCqwB,EAAkB3kC,KAAKilC,EAAevjC,GACtCijC,EAAkB3kC,KAAKilC,EAAer9B,GACtC+8B,EAAkB3kC,KAAKilC,EAAe3wB,GAEtCuwB,EAAS7kC,KAAK8kC,GACdD,EAAS7kC,KAAK8kC,GAEVvlC,EAAIqY,EAAOrZ,OAAS,IAEtBumC,GAAsBltB,EAAOrY,GAAG2Y,WAAW6sB,IAG/C,IAAII,EAAwB,IAAIrf,aAAa0Y,GACzC4G,EAAwB,IAAItf,aAAa4e,GACzCW,EAAwB,IAAIvf,aAAa6e,GACzCW,EAAwB,IAAIxf,aAAa8e,GACzCW,EAAwB,IAAIzf,aAAa+e,GAEzCtG,EAAU,GACd,IAAK,IAAIh/B,EAAI,EAAGA,GAAM4lC,EAAW5mC,OAAS,EAAK,GAAK,EAAGgB,IACvD,CACE,IAAI+lB,EAAa,EAAJ/lB,EAAS,EACtBg/B,EAAQv+B,KAAKslB,GACbiZ,EAAQv+B,KAAKslB,EAAQ,GACrBiZ,EAAQv+B,KAAKslB,EAAQ,GAErBiZ,EAAQv+B,KAAKslB,GACbiZ,EAAQv+B,KAAKslB,EAAQ,GACrBiZ,EAAQv+B,KAAKslB,EAAQ,GAGvB3rB,KAAKma,SAAS0xB,SAASjH,GACvB5kC,KAAKma,SAASxN,aAAa,YAAY4Q,KAAK,IAAI0P,EAAgBue,EAAY,IAC5ExrC,KAAKma,SAASxN,aAAa,iBAAiB4Q,KAAK,IAAI0P,EAAgBwe,EAAkB,IACvFzrC,KAAKma,SAASxN,aAAa,qBAAqB4Q,KAAK,IAAI0P,EAAgBye,EAAsB,IAC/F1rC,KAAKma,SAASxN,aAAa,eAAe4Q,KAAK,IAAI0P,EAAgB0e,EAAiB,IACpF3rC,KAAKma,SAASxN,aAAa,YAAY4Q,KAAK,IAAI0P,EAAgB2e,EAAc,IAE9E5rC,KAAKma,SAASxN,aAAa,YAAY4J,aAAc,EACrDvW,KAAKma,SAASxN,aAAa,iBAAiB4J,aAAc,EAC1DvW,KAAKma,SAASxN,aAAa,qBAAqB4J,aAAc,EAC9DvW,KAAKma,SAASxN,aAAa,eAAe4J,aAAc,EACxDvW,KAAKma,SAASxN,aAAa,YAAY4J,aAAc,EAErDvW,KAAKqa,SAASvI,SAAS84B,QAAQlmC,MAAQymC,EACvCnrC,KAAK8rC,QAAUX,EAGjBY,cAAcrnC,GAEZ1E,KAAKqa,SAASvI,SAAS64B,WAAWjmC,MAAQA,EAG5CqnC,gBAEE,OAAO/rC,KAAKqa,SAASvI,SAAS64B,WAAWjmC,MAG3C3E,wBAAwBke,EAAQrY,GAE9B,OAAU,IAANA,EAEKqY,EAAO,GAAGZ,QAAQoB,IAAIR,EAAO,IAAI5B,gBAAgB,GAAGlL,IAAI8M,EAAO,IAI/DA,EAAOrY,EAAI,GAItB7F,oBAAoBke,EAAQrY,GAE1B,OAAIA,IAAMqY,EAAOrZ,OAAS,EAEjBqZ,EAAOA,EAAOrZ,OAAS,GAAGyY,QAAQoB,IAAIR,EAAOA,EAAOrZ,OAAS,IAAIyX,gBAAgB,GAAGlL,IAAI8M,EAAOA,EAAOrZ,OAAS,IAI/GqZ,EAAOrY,EAAI,GAItB7F,UAIAA,WAEE,OAAOC,KAAKmrC,mBAGdprC,eAEE,OAAOC,KAAKmrC,mBAGdprC,UAEEC,KAAKma,SAASC,UACdpa,KAAKqa,SAASD,UACVpa,KAAKgsC,QAEPhsC,KAAKgsC,OAAO56B,OAAOpR,MAIvB+Y,UAAUqW,GAERpvB,KAAKqa,SAASvI,SAASK,OAAOzN,MAAMoV,IAAIsV,GAG1CrW,YAEE,OAAO/Y,KAAKqa,SAASvI,SAASK,OAAOzN,MAGvC3E,WAAWqvB,GAETpvB,KAAKqa,SAASvI,SAASK,OAAOzN,MAAM6Y,KAAK6R,IC1L9B,MAAM6c,WAAmBzxB,EAEtCza,YAAYwiB,EAAS2pB,GAEnBA,EAAQA,GAAS,IAAIn+B,EAAQ,EAAG,GAChC,IAAIsM,EAAW,IAAI1I,EAAe,CAChCG,SAAU,CACR0B,SAAU,CAAE9O,MAAO6d,GACnB4pB,eAAgB,CAAEznC,MAAO,GACzB0nC,OAAQ,CAAE1nC,MAAO,GACjB2nC,SAAU,CAAE3nC,MAAO,IAErBqN,igBACAE,mLACA8M,aAAa,EACbpL,YAAY,EACZsD,KAAMq1B,KAEJnyB,EAAW,IAAIoyB,GAAc,EAAG,EAAG,GACvCpyB,EAASiB,WAAW8wB,EAAMnkC,EAAI,GAAImkC,EAAMj+B,EAAI,EAAG,GAC/C,IAAIu+B,EAAgBjqB,EAAQzF,MAAMnH,MAAQ4M,EAAQzF,MAAMtG,OACxD2D,EAASzB,MAAM8zB,EAAe,EAAG,GACjCzjC,MAAMoR,EAAUE,GAChBra,KAAKwsC,cAAgBA,EACrBxsC,KAAKma,SAASsyB,qBAEdzsC,KAAK0sC,YAAc,IAAI9zB,EACvB5Y,KAAKma,SAASwyB,YAAYjqB,QAAQ1iB,KAAK0sC,aAGzC3sC,iBAEEC,KAAKqa,SAASvI,SAAS0B,SAAS9O,MAAM6R,aAAc,EACpD,IAAIq2B,EAAM5sC,KAAKqa,SAASvI,SAAS0B,SAAS9O,MAAMoY,MAEhD9c,KAAKma,SAASzB,MAAM,EAAI1Y,KAAKwsC,cAAe,EAAG,GAC/CxsC,KAAKwsC,cAAgBI,EAAIj3B,MAAQi3B,EAAIp2B,OACrCxW,KAAKma,SAASzB,MAAM1Y,KAAKwsC,cAAe,EAAG,GAC3CxsC,KAAKma,SAASsyB,qBACdzsC,KAAKma,SAASwyB,YAAYjqB,QAAQ1iB,KAAK0sC,aAGzCnqC,WAEE,OAAOvC,KAAK0sC,YAAYrvB,QAAQhB,eAAerc,KAAK0Y,MAAM3Q,GAG5DxF,SAASmC,GAEP1E,KAAK0Y,MAAMoB,IAAIpV,EAAOA,EAAOA,GAC7B1E,KAAKqa,SAASvI,SAASs6B,OAAO1nC,MAAQA,EAGxCmoC,mBAAmBC,GAEjB9sC,KAAKqa,SAASvI,SAASq6B,eAAeznC,OAAoB,IAAZooC,EAAmB,EAAI,EAGvED,qBAEE,OAAuD,IAAhD7sC,KAAKqa,SAASvI,SAASq6B,eAAeznC,MAG/C2M,YAAYA,GAEVrR,KAAKqa,SAASvI,SAASu6B,SAAS3nC,MAAQ2M,EAG1CA,cAEE,OAAOrR,KAAKqa,SAASvI,SAASu6B,SAAS3nC,MAGzC3E,UAEEC,KAAKma,SAASC,UACdpa,KAAKgsC,OAAO56B,OAAOpR,MACnBA,KAAKqa,SAASvI,SAAS0B,SAAS9O,MAAM0V,UACtCpa,KAAKqa,SAASD,WClFH,MAAM2yB,WAAed,GAElClsC,YAAYwV,EAAMC,EAAMuD,EAAOmzB,EAAOc,GAEpC,IAAIC,EAAqB,IAAIzN,GAAiBwN,GAE1CE,EAAgB,CAClB13B,KAAMA,EACNM,WAAYiD,GAAS,WAEnB9C,EAAiBg3B,EAAmBE,gBAAgB53B,EAAM23B,GAE9Dj3B,EAAe0hB,UAAYyV,GAC3Bn3B,EAAe0hB,UAAYC,EAC3B3hB,EAAeM,aAAc,EAC7BxN,MAAMkN,EAAgBi2B,GAEtBlsC,KAAKitC,mBAAqBA,EAC1BjtC,KAAKiW,eAAiBA,EACtBjW,KAAKktC,cAAgBA,EAGvB33B,SAAS7Q,GAEP1E,KAAKitC,mBAAmBj3B,YAAYtR,EAAO1E,KAAKktC,eAChDltC,KAAKqtC,iBAGP93B,WAEE,MAAO,mBC7BI,MAAM+3B,WAA0B57B,GAE7C3R,YAAYwtC,EAAY,GAEtBxkC,w1BAAkB,CAChByK,SAAU,CAAE9O,WAAOkC,GACnB+V,YAAa,CAAEjY,MAAO,IAAIqJ,EAAQyS,OAAO7K,MAAO6K,OAAOhK,SACvDoG,aAAc,CAAElY,MAAO,IAAIqJ,GAC3By/B,aAAc,CAAE9oC,MAAO,IAAIqJ,EAAQ,EAAG,IACtC0/B,KAAM,CAAE/oC,MAAO,IAAIkU,GACnB80B,YAAa,CAAEhpC,MAAO,IAAIqJ,GAC1B4/B,aAAc,CAAEjpC,MAAO,KAEzB1E,KAAK+e,aAAc,EACnB/e,KAAK2T,YAAa,EAClB3T,KAAK8T,WAAY,GCpBN,MAAM85B,GAEnB7tC,cAEEC,KAAKwvB,QAAU,IAAIzhB,EAGrBhO,YAAYgc,GAEV,OAAO/b,KAAKwvB,QAAQ1V,IAAIiC,EAAShU,EAAGgU,EAAS9N,ICNlC,MAAM4/B,GAEnB9tC,cAEEC,KAAK8tC,SAAW,IAAIl1B,EACpB5Y,KAAKyvB,SAAW,IAAI1hB,EAGtBhO,YAAYgc,GAKV,OAHA/b,KAAK8tC,SAASvwB,KAAKxB,GACnB/b,KAAK8tC,SAAS3b,QAAQ3Q,GAActN,SAE7BlU,KAAKyvB,SAAS3V,IAAI9Z,KAAK8tC,SAAS/lC,EAAG/H,KAAK8tC,SAAS7/B,IClB7C,MAAM8/B,GAEnBhuC,eAKAA,OAAOiuC,EAAYC,IAKnBluC,SAASiuC,IAGTjuC,QAAQiuC,KCbK,MAAME,WAAeH,GAElChuC,cAEEgJ,QAGFhJ,OAAOiuC,EAAYC,GAEbD,EAAWG,cAAcF,IAE3BD,EAAWv9B,UAAUu9B,EAAWI,kBCXvB,MAAMC,WAAqBN,GAExChuC,cAEEgJ,QAGFhJ,SAASiuC,GAEPA,EAAWM,iBAGbvuC,OAAOiuC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BD,EAAWv9B,UAAUu9B,EAAWO,iBAIhCP,EAAWv9B,UAAUu9B,EAAWQ,iBCpBvB,MAAMC,WAAoBV,GAEvChuC,cAEEgJ,QAGFhJ,SAASiuC,GAEPA,EAAWU,gBACXV,EAAWv9B,UAAUu9B,EAAWW,iBCVrB,MAAMC,WAAqBb,GAExChuC,cAEEgJ,QAGFhJ,SAASiuC,GAEPhuC,KAAK6uC,mBAAmBb,GAG1BjuC,OAAOiuC,EAAYC,GAEbD,EAAWG,cAAcF,GAE3BjuC,KAAK6uC,mBAAmBb,GAIxBA,EAAWv9B,UAAUu9B,EAAWQ,gBAIpCzuC,mBAAmBiuC,GAEjBA,EAAWc,kBCRA,MAAMC,WAAkBv0B,EAErCza,YAAY6R,EAAMC,GAEhB9I,MAAM,IAAIwjC,GAAc,EAAG,GAAI,IAAIe,IAEnCttC,KAAKgvC,cAAe,EAEpBhvC,KAAKivC,kBAAoB,IAAIpB,GAC7B7tC,KAAK4O,cAAgB,IAAIs/B,GAEzBluC,KAAKkvC,UAAY,IAAIt2B,EAErB5Y,KAAK2uC,eAAiB,IAAIT,GAC1BluC,KAAKouC,gBAAkB,IAAIC,GAC3BruC,KAAKwuC,eAAiB,IAAIC,GAC1BzuC,KAAKuuC,gBAAkB,IAAIK,GAE3B5uC,KAAK4P,cAAWhJ,EAChB5G,KAAK2P,aAAU/I,EACf5G,KAAKmvC,cAAWvoC,EAEhB5G,KAAKovC,cAAgB,IAAIrhC,EACzB/N,KAAKqvC,oBAAsB,IAAIthC,EAC/B/N,KAAKsvC,eAAiB,IAAIvhC,EAE1B/N,KAAKuvC,aAAe,IAAIxhC,EAAQ,EAAG,GAEnC/N,KAAKme,eAAgB,EACrBne,KAAKwvC,kBAAmB,EACxBxvC,KAAKqZ,YAAc,EAEnBrZ,KAAKuC,KAAO,EACZvC,KAAKyvC,aAAe,IAAI1hC,EAG1BhO,iBAAiB2E,GAEf1E,KAAKqZ,YAAc3U,EAGrBgrC,kBAEE,OAAO1vC,KAAKqa,SAASvI,SAAS47B,YAAYhpC,MAG5C3E,iBAAiBqgB,GAEfpgB,KAAKyvC,aAAalyB,KAAK6C,GACvBpgB,KAAKqa,SAASvI,SAAS07B,aAAa9oC,MAAM6Y,KAAK6C,GAGjDrgB,UAAUmlB,GAERllB,KAAK4O,cAAce,QAAQ3P,MAC3BA,KAAK4O,cAAgBsW,EACrBllB,KAAK4O,cAAcgB,SAAS5P,MAG9B+b,eAEE,OAAO/b,KAAKkvC,UAGdS,cAAc7C,GAEZ9sC,KAAKqa,SAASvG,UAAYg5B,EAG5B6C,gBAEE,OAAO3vC,KAAKqa,SAASvG,UAGvB87B,iBAAiBlrC,GAEf1E,KAAKqa,SAASvI,SAAS67B,aAAajpC,MAAQA,EAG9CkrC,mBAEE,OAAO5vC,KAAKqa,SAASvI,SAAS67B,aAAajpC,MAG7C3E,cAEEC,KAAK6vC,SAAU,EAGjB9vC,oCAEEC,KAAKivC,kBAAoB,IAAIpB,GAG/B9tC,qCAEEC,KAAKivC,kBAAoB,IAAIrB,GAG/B7tC,YAAYwiB,GAEVA,EAAQoV,UAAYthB,EACpBkM,EAAQsV,UAAYxhB,EACpBkM,EAAQhM,aAAc,EAEtBvW,KAAKuvC,aAAaz1B,IAAIyI,EAAQzF,MAAMnH,MAAO4M,EAAQzF,MAAMtG,QAEzDxW,KAAKqa,SAASvI,SAAS0B,SAAS9O,MAAQ6d,EACxCviB,KAAK8vC,SAAS9vC,KAAKqa,SAASvI,SAAS8K,aAAalY,OAClD1E,KAAK6vC,SAAU,EAGjB9vC,aAAagwC,GAEX/vC,KAAKqa,SAASvI,SAAS6K,YAAYjY,MAAMoV,IAAI0G,GAAO7K,MAAO6K,GAAOhK,QAClExW,KAAK8vC,SAAS9vC,KAAKqa,SAASvI,SAAS8K,aAAalY,OAElD1E,KAAKqvC,oBAAoB9xB,KAAKvd,KAAKivC,kBAAkBe,YAAYhwC,KAAK+b,WACtE/b,KAAKqa,SAASvI,SAAS27B,KAAK/oC,MAAM6Y,KAAKvd,KAAK+b,UAC5C/b,KAAK4O,cAAcQ,OAAOpP,KAAM+vC,GAGlChwC,cAAcgwC,GAEZ/vC,KAAKsvC,eAAe/xB,KAAKvd,KAAKqvC,qBAC9BrvC,KAAKiwC,mBAAmBjwC,KAAKsvC,gBAC7BtvC,KAAKsvC,eAAevnC,GAAK/H,KAAKyvC,aAAa1nC,EAC3C/H,KAAKsvC,eAAerhC,GAAKjO,KAAKyvC,aAAaxhC,EAE3C,IAAIiiC,GAAO,IAAIC,IAAOhxB,qBAAqBnf,KAAKsvC,eAAgBtvC,KAAK8vC,YAKrE,OAHA9vC,KAAKovC,cAAc7xB,KAAKwyB,GACxB/vC,KAAKiwC,mBAAmBjwC,KAAKovC,eAEtBc,EAAKE,cAAcpwC,KAAKovC,eAGjCrvC,mBAAmBswC,GAEjBA,EAActoC,GAAuB,GAAlBsoC,EAActoC,EAAU,IAAOyY,GAAO7K,MAAS3V,KAAKyvC,aAAa1nC,EACpFsoC,EAAcpiC,GAAuB,GAAlBoiC,EAAcpiC,EAAU,IAAOuS,GAAOhK,OAASxW,KAAKyvC,aAAaxhC,EAGtFlO,4BAEE,IAAIqe,EAAMpe,KAAKqvC,oBAAoBhyB,QAEnC,OADArd,KAAKiwC,mBAAmB7xB,GACjBA,EAGTre,0BAA0BuwC,GAExBtwC,KAAK+b,SAAShU,EAAKuoC,EAAWvoC,EAAIyY,GAAO7K,MAAS,EAAI,EACtD3V,KAAK+b,SAAS9N,EAAKqiC,EAAWriC,EAAIuS,GAAOhK,OAAU,EAAI,EAGzDzW,UAEMC,KAAKqa,SAASvI,SAAS0B,SAAS9O,OAElC1E,KAAKqa,SAASvI,SAAS0B,SAAS9O,MAAM0V,UAExCoG,GAAO+vB,uBAAuBvwC,KAAKqa,UACnCra,KAAKma,SAASC,UACdpa,KAAKqa,SAASD,UAGhBra,SAASqc,GAEP,OAAIA,EAEKA,EAAQmB,KAAKvd,KAAKuvC,cAAclzB,eAAerc,KAAKuC,KAAOie,GAAOhJ,MAIlE,IAAIzJ,GAAUwP,KAAKvd,KAAKuvC,cAAclzB,eAAerc,KAAKuC,KAAOie,GAAOhJ,KAInFzX,kBAGAA,iBAGAA,mBC3Ma,MAAMywC,WAA8Bh2B,EAEjDza,YAAYoa,EAAUE,GAEpBtR,MAAMoR,EAAUE,GAEhB,IAAIo2B,EAAOzwC,KAEXA,KAAK0wC,eAAiB,KAEpBD,EAAKp2B,SAASjL,WCVL,MAAMuhC,GAEnB5wC,YAAYqgB,EAAQwwB,EAAcC,GAEhC,IAAIl7B,EAAUi7B,EAAatf,MAAQsf,EAAaxe,KAC5C5b,EAAUo6B,EAAave,IAAQue,EAAate,OAEhDtyB,KAAK0Y,MAAW,IAAI3K,EAAQ4H,EAAOa,GACnCxW,KAAK+b,SAAW,IAAIhO,EAAQqS,EAASwwB,EAAaxe,KAAMwe,EAAate,QAErEtyB,KAAK6wC,aAAe,IAAIjyB,EAAQiyB,EAAaze,KAAMye,EAAavf,MAAOuf,EAAaxe,IAAKwe,EAAave,SCT3F,MAAMwe,GAEnB/wC,YAAYgxC,EAAcx7B,EAAO,IAE/BvV,KAAK+wC,aAAeA,EAEpB/wC,KAAKgxC,OAAS,GAEdhxC,KAAKixC,gBAAkB,EACvBjxC,KAAKkxC,iBAAkB,EACvBlxC,KAAKmxC,gBAAkB,EAEvBnxC,KAAK+b,SAAW,IAAInD,EACpB5Y,KAAK4b,WAAa,IAAI4oB,EACtBxkC,KAAK0Y,MAAQ,IAAIE,EAAQ,EAAG,EAAG,GAC/B5Y,KAAKoxC,OAAS,IAAI7hB,EAElBvvB,KAAK+Y,MAAQ,IAAI3G,EAAM,WAEvBpS,KAAK0vC,YAAc,IAAI3hC,EACvB/N,KAAKqxC,UAAY,EAEjBrxC,KAAKsxC,OAAW/7B,EAEhBvV,KAAKuxC,kBAAkBh8B,GAGzBA,SAAS7Q,GAEP1E,KAAKsxC,OAAS5sC,EACd1E,KAAKuxC,kBAAkB7sC,GACvB1E,KAAKkxC,iBAAkB,EAGzB37B,WAEE,OAAOvV,KAAKsxC,OAGdvxC,gBAEEC,KAAKoxC,OAAOI,QAAQxxC,KAAK+b,SAAU/b,KAAK4b,WAAY5b,KAAK0Y,OACzD1Y,KAAKkxC,iBAAkB,EACvBlxC,KAAKixC,gBAAiB,EAGxBlxC,oBAEEC,KAAKixC,gBAAiB,EAGxBlxC,oBAEEC,KAAKmxC,gBAAiB,EAGxBpxC,aAAakrC,EAAc,EAAGwG,EAAO,GAEnC,IAAIC,GAAkB,IAAIlN,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,GAAKqyB,EAAc,IAAOnkC,KAAKuB,GAAK,GAC1GspC,GAAW,IAAInN,GAAaC,iBAAiB,IAAI7rB,EAAQ,EAAG,EAAG,IAAM64B,EAAO,IAAO3qC,KAAKuB,GAAK,GAEjGrI,KAAK4b,WAAW2B,KAAKm0B,EAAgBE,SAASD,IAC9C3xC,KAAKkxC,iBAAkB,EAGzBnxC,aAAaqe,GAEXpe,KAAK+b,SAASwB,KAAKa,GACnBpe,KAAKkxC,iBAAkB,EAGzBnxC,SAASwC,GAEPvC,KAAK0Y,MAAMoB,IAAIvX,EAAMA,EAAMA,GAC3BvC,KAAKkxC,iBAAkB,EAGzBnxC,UAAUqvB,GAERpvB,KAAK+Y,MAAMe,IAAIsV,GACfpvB,KAAKmxC,gBAAiB,EAGxBpxC,UAAUmsC,GAERlsC,KAAK0vC,YAAYnyB,KAAK2uB,GACtBlsC,KAAK6xC,gBAGPxgC,YAAYygC,GAEV9xC,KAAKqxC,UAAYS,EACjB9xC,KAAKmxC,gBAAiB,EAGxB9/B,cAEE,OAAOrR,KAAKqxC,UAGdtxC,gBAEEC,KAAKuxC,kBAAkBvxC,KAAKuV,MAG9BxV,kBAAkBwV,GAEhB,IAAIw8B,EAAS,EAEb/xC,KAAKgxC,OAAOpsC,OAAS,EAErB,IAAK,IAAIgB,EAAI,EAAGA,EAAI2P,EAAK3Q,OAAQgB,IACjC,CACE,IAAIosC,EAAUz8B,EAAK08B,WAAWrsC,GAC1BssC,EAAQlyC,KAAK+wC,aAAaxnC,MAAKC,GAAWA,EAAQwoC,UAAYA,IAClE,GAAIE,EACJ,CACE,GAAIA,EAAMC,YACV,CACE,IAAIC,EAAa,IAAIzB,GAAUoB,EAAQG,EAAMC,YAAaD,EAAMG,aAChEryC,KAAKgxC,OAAO3qC,KAAK+rC,GAEnBL,GAAUG,EAAMI,SAIpB,IAAIC,EAAO,IAAIpC,GACXqC,EAAcxyC,KAAKgxC,OAAO,GAC9BuB,EAAKpzB,qBAAqBqzB,EAAYz2B,SAASsB,QAAQlM,IAAI,IAAIpD,EAAQykC,EAAY95B,MAAM3Q,EAAI,EAAGyqC,EAAY95B,MAAMzK,EAAI,IAAKukC,EAAY95B,OAEvI,IAAK,IAAI9S,EAAI,EAAGA,EAAI5F,KAAKgxC,OAAOpsC,OAAQgB,IACxC,CACE,IAAI+oB,EAAI3uB,KAAKgxC,OAAOprC,GAChBqZ,GAAM,IAAIkxB,IAAOhxB,qBAAqBwP,EAAE5S,SAASsB,QAAQlM,IAAI,IAAIpD,EAAQ4gB,EAAEjW,MAAM3Q,EAAI,EAAG4mB,EAAEjW,MAAMzK,EAAI,IAAK0gB,EAAEjW,OAC/G65B,EAAKE,MAAMxzB,GAGb,IAAIyzB,EAAY,IAAI3kC,EACpBwkC,EAAK7vB,QAAQgwB,GACb,IAAK,IAAI9sC,EAAI,EAAGA,EAAI5F,KAAKgxC,OAAOpsC,OAAQgB,IAEtC5F,KAAKgxC,OAAOprC,GAAGmW,SAAShU,GAAK2qC,EAAU3qC,EAAI,EAC3C/H,KAAKgxC,OAAOprC,GAAGmW,SAAS9N,GAAKykC,EAAUzkC,EAAI,EAE3CjO,KAAKgxC,OAAOprC,GAAGmW,SAAShU,GAAM2qC,EAAU3qC,EAAI,EAAK/H,KAAK0vC,YAAY3nC,EAClE/H,KAAKgxC,OAAOprC,GAAGmW,SAAS9N,GAAMykC,EAAUzkC,EAAI,EAAKjO,KAAK0vC,YAAYzhC,EAGpEjO,KAAKixC,gBAAiB,GCjJX,MAAM0B,WAAwBjhC,GAE3C3R,YAAYwiB,GAEVxZ,i6CAAkB,CAChB6pC,SAAU,CAAEluC,MAAO6d,GACnBswB,UAAW,CAAEnuC,MAAO,IACpBouC,WAAY,CAAEpuC,MAAO,IAAIqJ,EAAQ,EAAG,MAGtC/N,KAAK+e,aAAc,EACnB/e,KAAKykB,WAAa,CAChB8lB,aAAa,GAEfvqC,KAAK2T,YAAa,EAClB3T,KAAKiX,KAAOq1B,GACZ/pB,EAAQoV,UAAYC,EACpBrV,EAAQsV,UAAYD,EACpBrV,EAAQjM,iBAAkB,EAG5BvW,eAAewC,GAEbvC,KAAK8R,SAASghC,WAAWpuC,MAAM6Y,KAAKhb,GAGtCxC,aAAa2E,GAEX1E,KAAK8R,SAAS+gC,UAAUnuC,MAAQuB,EAAM+C,KAAK,GAAK,GAAKtE,ICpB1C,MAAMquC,WAAqBv4B,EAExCza,YAAYizC,EAAaC,GAEvB,IAEIC,EAAqB,IAAIC,GAC7BD,EAAmBE,cAAgB,EAEnC,IAAIj5B,EAAW,IAAIwE,EAAoB,EAAG,GAC1CxE,EAASiB,UAAU,GAAK,GAAK,GAC7B83B,EAAmB99B,aAAa,WAAa,IAAIi+B,GAAuBl5B,EAASxN,aAAa,YAAY0zB,MAAO,IACjH6S,EAAmB99B,aAAa,KAAa,IAAIi+B,GAAuBl5B,EAASxN,aAAa,MAAM0zB,MAAO,IAC3G6S,EAAmBvnB,MAAQxR,EAASwR,MAEpC,IAAI2nB,EAAiB,IAAIC,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GACxFC,EAAiB,IAAIF,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GACxFE,EAAiB,IAAIH,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GACxFG,EAAiB,IAAIJ,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GAExFI,EAAe,IAAIL,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GACtF5C,EAAe,IAAI2C,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GAEtFz6B,EAAQ,IAAIw6B,GAAyB,IAAIpnB,aAAaqnB,KAAsB,GAAG,GAEnFF,EAAeO,MAASC,GACxBL,EAAeI,MAASC,GACxBJ,EAAeG,MAASC,GACxBH,EAAeE,MAASC,GACxBF,EAAaC,MAAWC,GACxBlD,EAAaiD,MAAWC,GACxB/6B,EAAM86B,MAAkBC,GAExBZ,EAAmB99B,aAAa,iBAAkBk+B,GAClDJ,EAAmB99B,aAAa,iBAAkBq+B,GAClDP,EAAmB99B,aAAa,iBAAkBs+B,GAClDR,EAAmB99B,aAAa,iBAAkBu+B,GAElDT,EAAmB99B,aAAa,eAAgBw+B,GAChDV,EAAmB99B,aAAa,eAAgBw7B,GAChDsC,EAAmB99B,aAAa,QAAgB2D,GAEhDhQ,MAAMmqC,EAAoB,IAAIP,GAAgBM,IAE9CjzC,KAAK+zC,cAAgB,GACrB/zC,KAAKgzC,YAAcA,EAEnBhzC,KAAKqa,SAAS25B,eAAe,IAAIjmC,EAAQilC,EAAYiB,MAAMt+B,MAAOq9B,EAAYiB,MAAMz9B,SAEpFxW,KAAKme,eAAgB,EAGvBpe,aAAa2E,GAEX1E,KAAKqa,SAAS65B,aAAaxvC,GAG7B3E,SAASo0C,GAEP,IAAIzmB,EAAO,IAAIojB,GAAQ9wC,KAAKgzC,YAAYhC,OAAQmD,GAEhD,OADAn0C,KAAK+zC,cAAc1tC,KAAKqnB,GACjBA,EAGT3tB,YAAYq0C,GAEVlU,GAAemU,YAAYr0C,KAAK+zC,cAAeK,GAC/Cp0C,KAAKoP,QAAO,GAGdrP,OAAOu0C,GAEL,IAAIC,EAAmBv0C,KAAKma,SAASxN,aAAa,gBAC9C6nC,EAAmBx0C,KAAKma,SAASxN,aAAa,gBAE9C2mC,EAAiBtzC,KAAKma,SAASxN,aAAa,kBAC5C8mC,EAAiBzzC,KAAKma,SAASxN,aAAa,kBAC5C+mC,EAAiB1zC,KAAKma,SAASxN,aAAa,kBAC5CgnC,EAAiB3zC,KAAKma,SAASxN,aAAa,kBAE5C8nC,EAAYz0C,KAAKma,SAASxN,aAAa,SAEvC+nC,GAAuC,IAAjBJ,EACtBK,GAAuC,IAAjBL,EACtBM,GAAuC,IAAjBN,EAEtBO,EAAc,EAClB,IAAK,IAAIjvC,EAAI,EAAGA,EAAI5F,KAAK+zC,cAAcnvC,OAAQgB,IAC/C,CACE,IAAI2P,EAAOvV,KAAK+zC,cAAcnuC,GAE1B2P,EAAK27B,kBAEPwD,GAAsB,EACtBn/B,EAAKu/B,iBAGHv/B,EAAK07B,iBAEP0D,GAAqB,EACrBp/B,EAAKw/B,qBAGHx/B,EAAK47B,iBAEPyD,GAAqB,EACrBr/B,EAAKy/B,qBAGP,IAAI5D,EAAS77B,EAAK67B,OACdr4B,EAAQxD,EAAKwD,MACb1H,EAAUkE,EAAKlE,QAEnB,IAAK,IAAI4jC,EAAU,EAAGA,EAAU1/B,EAAKy7B,OAAOpsC,OAAQqwC,IACpD,CACE,IAAI/C,EAAQ38B,EAAKy7B,OAAOiE,GAEpBC,EAAWL,EAEfN,EAAiBY,QAAQD,EAAUhD,EAAMrB,aAAa9oC,EAAGmqC,EAAMrB,aAAa5iC,EAAGikC,EAAMrB,aAAal2B,EAAGu3B,EAAMrB,aAAar0B,GACxHg4B,EAAiBW,QAAQD,EAAUhD,EAAMn2B,SAAShU,EAAGmqC,EAAMn2B,SAAS9N,EAAGikC,EAAMx5B,MAAM3Q,EAAGmqC,EAAMx5B,MAAMzK,GAElGqlC,EAAe6B,QAAQD,EAAU9D,EAAOpiB,SAAS,GAC/CoiB,EAAOpiB,SAAS,GAChBoiB,EAAOpiB,SAAS,GAChBoiB,EAAOpiB,SAAS,IAElBykB,EAAe0B,QAAQD,EAAU9D,EAAOpiB,SAAS,GAC/CoiB,EAAOpiB,SAAS,GAChBoiB,EAAOpiB,SAAS,GAChBoiB,EAAOpiB,SAAS,IAElB0kB,EAAeyB,QAAQD,EAAU9D,EAAOpiB,SAAS,GAC/CoiB,EAAOpiB,SAAS,GAChBoiB,EAAOpiB,SAAS,IAChBoiB,EAAOpiB,SAAS,KAElB2kB,EAAewB,QAAQD,EAAU9D,EAAOpiB,SAAS,IAC/CoiB,EAAOpiB,SAAS,IAChBoiB,EAAOpiB,SAAS,IAChBoiB,EAAOpiB,SAAS,KAElBylB,EAAUU,QAAQD,EAAUn8B,EAAMyV,EAAGzV,EAAM4V,EAAG5V,EAAM1L,EAAGgE,GAEvDwjC,KAIJ70C,KAAKma,SAASi5B,cAAgByB,EAE1BA,EAAc70C,KAAKwzC,iBAErBxwC,QAAQG,MAAM,iEAAkEnD,KAAKwzC,gBAAiBqB,EAAa70C,MAGjH00C,IAEFpB,EAAe/8B,aAAc,EAC7Bk9B,EAAel9B,aAAc,EAC7Bm9B,EAAen9B,aAAc,EAC7Bo9B,EAAep9B,aAAc,GAE3Bo+B,IAEFJ,EAAiBh+B,aAAc,EAC/Bi+B,EAAiBj+B,aAAc,GAE7Bq+B,IAEFH,EAAUl+B,aAAc,GAI5BxW,UAEEC,KAAKma,SAASC,UACdpa,KAAKqa,SAASD,WC9LH,MAAMg7B,GAEnBr1C,eAKAA,QAAQkF,KCLK,MAAMowC,WAA2B1sC,GAE9C5I,YAAY4G,EAAgBL,EAAO,EAAGC,EAAK,EAAGqC,EAAkB,UAE9DG,MAAMH,GAEN5I,KAAK2G,eAAiBA,EACtB3G,KAAKsG,KAAOA,EACZtG,KAAKuG,GAAKA,EAGZxG,OAAOkF,EAASwD,GAEd,IAAI6sC,EAAMt1C,KAAKsG,KAAK+W,QACpBi4B,EAAItsC,KAAKhJ,KAAKuG,GAAIvG,KAAK4I,gBAAgBH,IACvCxD,EAAQjF,KAAK2G,gBAAgB4W,KAAK+3B,ICZvB,MAAMC,WAA6BniC,GAEhDrT,cAEEgJ,i1GAAYnC,EAAW,CACrB4uC,WAAW,IAGbx1C,KAAK8R,SAAS2jC,WAAa,CAAE/wC,WAAOkC,GACpC5G,KAAK8R,SAAS4jC,eAAiB,CAAEhxC,MAAO,IAAIqJ,EAAQ,EAAG,IAGzDhO,YAAY8c,GAEV7c,KAAK8R,SAAS2jC,WAAW/wC,MAAQmY,EAEjC,IAAIta,EAAOvC,KAAK8vC,SAASjzB,GACzB7c,KAAK8R,SAAS4jC,eAAehxC,MAAM6Y,KAAKhb,GAG1CxC,SAAS8c,GAEP,OAAIA,EAAI84B,eAEC,IAAI5nC,EAAQjH,KAAKC,IAAI,EAAG8V,EAAIC,MAAM84B,YAAa9uC,KAAKC,IAAI,EAAG8V,EAAIC,MAAM+4B,cAE1Eh5B,EAAIyF,oBAEC,IAAIvU,EAAQ8O,EAAIlH,MAAOkH,EAAIrG,QAEhCqG,EAAIi5B,UAEC,IAAI/nC,EAAQ8O,EAAIC,MAAMnH,MAAOkH,EAAIC,MAAMtG,QAEzC,IAAIzI,EAAQ,EAAG,IClCX,MAAMgoC,GAEnBh2C,YAAY0R,GAEVzR,KAAK0d,GAAK,IAAIuD,EAAkB,EAAG,EAAG,CACpC2d,KAAMxS,EACN0L,OAAQ5L,EACRyL,UAAWthB,EACXwhB,UAAWxhB,IAEbrW,KAAKu0B,IAAM,IAAItT,EAAkB,EAAG,EAAG,CACrC2d,KAAMxS,EACN0L,OAAQ5L,EACRyL,UAAWthB,EACXwhB,UAAWxhB,IAGbrW,KAAKg2C,kBAAoB,IAAIT,GAG/Bx1C,OAAOwiB,GAEL,IAAI0zB,EAAWj2C,KAAK8vC,SAASvtB,GACzB0zB,EAASluC,IAAM/H,KAAK0d,GAAG/H,OAASsgC,EAAShoC,IAAMjO,KAAK0d,GAAGlH,SAEzDxW,KAAK0d,GAAGiE,QAAQs0B,EAASluC,EAAGkuC,EAAShoC,GACrCjO,KAAKu0B,IAAI5S,QAAQs0B,EAASluC,EAAGkuC,EAAShoC,IAGxCjO,KAAKg2C,kBAAkB11B,YAAYiC,GACnCoG,GAAShC,cAAc3mB,KAAKg2C,kBAAmBh2C,KAAK0d,IAEpD,IAAK,IAAI9X,EAAI,EAAGA,EAAI,EAAGA,IAErB5F,KAAKg2C,kBAAkB11B,YAAYtgB,KAAK0d,GAAG6E,SAC3CoG,GAAShC,cAAc3mB,KAAKg2C,kBAAmBh2C,KAAKu0B,KAEpDv0B,KAAKg2C,kBAAkB11B,YAAYtgB,KAAKu0B,IAAIhS,SAC5CoG,GAAShC,cAAc3mB,KAAKg2C,kBAAmBh2C,KAAK0d,IAGtD,OAAO1d,KAAK0d,GAGd3d,SAAS8c,GAEP,OAAIA,EAAI84B,eAEC,IAAI5nC,EAAQjH,KAAKC,IAAI,EAAG8V,EAAIC,MAAM84B,YAAa9uC,KAAKC,IAAI,EAAG8V,EAAIC,MAAM+4B,cAE1Eh5B,EAAIyF,oBAEC,IAAIvU,EAAQ8O,EAAIlH,MAAOkH,EAAIrG,QAEhCqG,EAAIi5B,UAEC,IAAI/nC,EAAQ8O,EAAIC,MAAMnH,MAAOkH,EAAIC,MAAMtG,QAEzC,IAAIzI,EAAQ,EAAG,IC3DX,MAAMmoC,WAA0Bz9B,EAE7C1Y,cAEEgJ,QACA/I,KAAKgpC,WAAa,GAElBhpC,KAAKm2C,eAAYvvC,EAGnB7G,kBAAkBoa,EAAUE,EAAU+7B,GAGpC,GAAIA,QAA8DxvC,IAAxCuT,EAASxN,aAAa,cAChD,CACE,IAAI0pC,EAAkBr2C,KAAKs2C,2BAA2Bn8B,EAASxN,aAAa,YAAYogB,OACxF5S,EAAS/E,aAAa,aAAcihC,GAOtC,IAAIp4B,EAAS,IAAIs4B,GAAOp8B,EAAUE,GAClC4D,EAAOE,eAAgB,EACvBne,KAAKm2C,UAAYl4B,EAEjBje,KAAKmR,IAAI8M,GAGXle,sBAAsBitB,IAKtBjtB,cAAciH,EAAMgmB,IAKpBjtB,2BAA2By2C,GAEzB,IAAIC,EAAaz2C,KAAK02C,qBAAqBF,GACvCrpB,EAAM,IAAIhB,aAA8B,EAAjBqqB,GAC3B,IAAK,IAAI5wC,EAAI,EAAGohC,EAAI,EAAGphC,EAAqB,EAAjB4wC,EAAoB5wC,GAAK,EAAGohC,IAErD7Z,EAAIvnB,GAAOohC,EAAIyP,EAAcA,EAAe,GAAMA,EAClDtpB,EAAIvnB,EAAI,GAAMkB,KAAK8kB,MAAMob,EAAIyP,GAAcA,EAAe,GAAMA,EAGlE,OAAO,IAAIxpB,EAAgBE,EAAK,GAGlCptB,qBAAqBy2C,GAEnB,OAAO1vC,KAAK2O,KAAK3O,KAAKqB,KAAKquC,IAG7Bz2C,SAEE,IAAK,IAAI6F,EAAI,EAAGA,EAAI5F,KAAKgpC,WAAWpkC,OAAQgB,IAE1C5F,KAAKgpC,WAAWpjC,GAAGwJ,SAIvBrP,8BAA8B4G,EAAgBic,GAE5C,IAAK,IAAIhd,EAAI,EAAGA,EAAI5F,KAAKgpC,WAAWpkC,OAAQgB,IAEtC5F,KAAKgpC,WAAWpjC,GAAGoB,OAASL,IAE9B3G,KAAKgpC,WAAWpjC,GAAG+wC,gBAAkB/zB,GAK3C7iB,UAEEC,KAAKm2C,UAAUh8B,SAASC,UACxBpa,KAAKm2C,UAAU97B,SAASD,WChFb,MAAMw8B,WAAkCxjC,GAErDrT,YAAY82C,GAEV9tC,MAAM8tC"}